From 99b2ba8944f1927da0a371d6a4bda05d0da9b736 Mon Sep 17 00:00:00 2001
From: Ivan Bravo Bravo <kolessios@gmail.com>
Date: Wed, 26 Oct 2022 00:12:46 -0500
Subject: [PATCH 001/347] added basic support for Docker Swarm services

---
 src/pages/api/docker/stats/[...service].js  | 37 +++++++++++++++++----
 src/pages/api/docker/status/[...service].js | 35 +++++++++++++++----
 2 files changed, 58 insertions(+), 14 deletions(-)

diff --git a/src/pages/api/docker/stats/[...service].js b/src/pages/api/docker/stats/[...service].js
index ca8c8bd3..c16eeb58 100644
--- a/src/pages/api/docker/stats/[...service].js
+++ b/src/pages/api/docker/stats/[...service].js
@@ -31,18 +31,41 @@ export default async function handler(req, res) {
     const containerNames = containers.map((container) => container.Names[0].replace(/^\//, ""));
     const containerExists = containerNames.includes(containerName);
 
-    if (!containerExists) {
-      res.status(200).send({
-        error: "not found",
+    if (containerExists) {
+      const container = docker.getContainer(containerName);
+      const stats = await container.stats({ stream: false });
+
+      res.status(200).json({
+        stats,
       });
       return;
     }
 
-    const container = docker.getContainer(containerName);
-    const stats = await container.stats({ stream: false });
+    // Try with a service deployed in Docker Swarm
+    const tasks = await docker.listTasks({
+      filters: {
+        service: [containerName],
+        // A service can have several offline containers, so we only look for an active one.
+        'desired-state': ['running']
+      }
+    }).catch(() => []);
 
-    res.status(200).json({
-      stats,
+    // For now we are only interested in the first one (in case replicas > 1).
+    // TODO: Show the result for all replicas/containers?
+    const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID
+
+    if (taskContainerId) {
+      const container = docker.getContainer(taskContainerId);
+      const stats = await container.stats({ stream: false });
+
+      res.status(200).json({
+        stats,
+      });
+      return;
+    }
+
+    res.status(200).send({
+      error: "not found",
     });
   } catch {
     res.status(500).send({
diff --git a/src/pages/api/docker/status/[...service].js b/src/pages/api/docker/status/[...service].js
index 8330ac3d..cc0f5675 100644
--- a/src/pages/api/docker/status/[...service].js
+++ b/src/pages/api/docker/status/[...service].js
@@ -29,17 +29,38 @@ export default async function handler(req, res) {
     const containerNames = containers.map((container) => container.Names[0].replace(/^\//, ""));
     const containerExists = containerNames.includes(containerName);
 
-    if (!containerExists) {
-      return res.status(200).send({
-        error: "not found",
+    if (containerExists) {
+      const container = docker.getContainer(containerName);
+      const info = await container.inspect();
+
+      return res.status(200).json({
+        status: info.State.Status,
       });
     }
 
-    const container = docker.getContainer(containerName);
-    const info = await container.inspect();
+    const tasks = await docker.listTasks({
+      filters: {
+        service: [containerName],
+        // A service can have several offline containers, we only look for an active one.
+        'desired-state': ['running']
+      }
+    }).catch(() => []);
 
-    return res.status(200).json({
-      status: info.State.Status,
+    // For now we are only interested in the first one (in case replicas > 1).
+    // TODO: Show the result for all replicas/containers?
+    const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID
+
+    if (taskContainerId) {
+      const container = docker.getContainer(taskContainerId);
+      const info = await container.inspect();
+
+      return res.status(200).json({
+        status: info.State.Status,
+      });
+    }
+
+    return res.status(200).send({
+      error: "not found",
     });
   } catch {
     return res.status(500).send({

From 712fbb53c75579e2ba9d6f540ce1a89e21509111 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 8 Dec 2022 15:54:01 -0800
Subject: [PATCH 002/347] Fix rate unit displays

---
 next-i18next.config.js                | 15 ++++++++-------
 public/locales/en/common.json         |  6 ++++--
 src/widgets/qbittorrent/component.jsx |  4 ++--
 src/widgets/speedtest/component.jsx   |  4 ++--
 4 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/next-i18next.config.js b/next-i18next.config.js
index ee6eaaa1..54aeebb4 100644
--- a/next-i18next.config.js
+++ b/next-i18next.config.js
@@ -98,20 +98,21 @@ module.exports = {
         );
 
         i18next.services.formatter.add("rate", (value, lng, options) => {
-          if (value === 0) return "0 Bps";
 
-          const bits = options.bits ? value : value / 8;
-          const k = 1024;
+          const k = options.binary ? 1024 : 1000;
+          const sizes = options.bits ? (options.binary ? BIBIT_UNITS : BIT_UNITS) : (options.binary ? BIBYTE_UNITS : BYTE_UNITS);
+
+          if (value === 0) return `0 ${sizes[0]}/s`;
+
           const dm = options.decimals ? options.decimals : 0;
-          const sizes = ["Bps", "KiBps", "MiBps", "GiBps", "TiBps", "PiBps", "EiBps", "ZiBps", "YiBps"];
 
-          const i = Math.floor(Math.log(bits) / Math.log(k));
+          const i = options.binary ? 2 : Math.floor(Math.log(value) / Math.log(k));
 
           const formatted = new Intl.NumberFormat(lng, { maximumFractionDigits: dm, minimumFractionDigits: dm }).format(
-            parseFloat(bits / k ** i)
+            parseFloat(value / k ** i)
           );
 
-          return `${formatted} ${sizes[i]}`;
+          return `${formatted} ${sizes[i]}/s`;
         });
 
         i18next.services.formatter.add("percent", (value, lng, options) =>
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 80ba5357..96d531e1 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -3,9 +3,11 @@
         "bytes": "{{value, bytes}}",
         "bits": "{{value, bytes(bits: true)}}",
         "bbytes": "{{value, bytes(binary: true)}}",
-        "bbits": "{{value, bytes(bits: true, binary: true)}}",
-        "byterate": "{{value, rate}}",
+        "bbits": "{{value, bytes(bits: true; binary: true)}}",
+        "byterate": "{{value, rate(bits: false)}}",
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bitrate": "{{value, rate(bits: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}",
         "percent": "{{value, percent}}",
         "number": "{{value, number}}",
         "ms": "{{value, number}}"
diff --git a/src/widgets/qbittorrent/component.jsx b/src/widgets/qbittorrent/component.jsx
index 3abc933d..d3836a6b 100644
--- a/src/widgets/qbittorrent/component.jsx
+++ b/src/widgets/qbittorrent/component.jsx
@@ -44,9 +44,9 @@ export default function Component({ service }) {
   return (
     <Container service={service}>
       <Block label="qbittorrent.leech" value={t("common.number", { value: leech })} />
-      <Block label="qbittorrent.download" value={t("common.bitrate", { value: rateDl })} />
+      <Block label="qbittorrent.download" value={t("common.bibyterate", { value: rateDl, decimals: 1 })} />
       <Block label="qbittorrent.seed" value={t("common.number", { value: completed })} />
-      <Block label="qbittorrent.upload" value={t("common.bitrate", { value: rateUl })} />
+      <Block label="qbittorrent.upload" value={t("common.bibyterate", { value: rateUl, decimals: 1 })} />
     </Container>
   );
 }
diff --git a/src/widgets/speedtest/component.jsx b/src/widgets/speedtest/component.jsx
index 3067dbf3..7d722faf 100644
--- a/src/widgets/speedtest/component.jsx
+++ b/src/widgets/speedtest/component.jsx
@@ -29,9 +29,9 @@ export default function Component({ service }) {
     <Container service={service}>
       <Block
         label="speedtest.download"
-        value={t("common.bitrate", { value: speedtestData.data.download * 1024 * 1024 })}
+        value={t("common.bitrate", { value: speedtestData.data.download * 1000 * 1000 })}
       />
-      <Block label="speedtest.upload" value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })} />
+      <Block label="speedtest.upload" value={t("common.bitrate", { value: speedtestData.data.upload * 1000 * 1000 })} />
       <Block
         label="speedtest.ping"
         value={t("common.ms", {

From 5e722b4d1166b50317443f0eb8d4c400dbcb9cd1 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 9 Dec 2022 22:33:26 -0800
Subject: [PATCH 003/347] Fix plex widget error with 1 library

---
 src/widgets/plex/proxy.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/widgets/plex/proxy.js b/src/widgets/plex/proxy.js
index 36b7a268..b91b3533 100644
--- a/src/widgets/plex/proxy.js
+++ b/src/widgets/plex/proxy.js
@@ -79,7 +79,7 @@ export default async function plexProxyHandler(req, res) {
     logger.debug("Getting libraries from Plex API");
     [status, apiData] = await fetchFromPlexAPI("/library/sections", widget);
     if (apiData && apiData.MediaContainer) {
-      libraries = apiData.MediaContainer.Directory;
+      libraries = [].concat(apiData.MediaContainer.Directory);
       cache.put(librariesCacheKey, libraries, 1000 * 60 * 60 * 6);
     }
   }

From 91d8e56471dd5442cb356ffe176e6d068ed7cf11 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 9 Dec 2022 21:51:24 -0800
Subject: [PATCH 004/347] append service name to cache keys

---
 src/widgets/homebridge/proxy.js   | 23 ++++++++++++-----------
 src/widgets/npm/proxy.js          | 12 ++++++------
 src/widgets/plex/proxy.js         | 15 +++++++++------
 src/widgets/pyload/proxy.js       | 26 +++++++++++++-------------
 src/widgets/transmission/proxy.js |  6 +++---
 src/widgets/unifi/proxy.js        |  5 +++--
 6 files changed, 46 insertions(+), 41 deletions(-)

diff --git a/src/widgets/homebridge/proxy.js b/src/widgets/homebridge/proxy.js
index 3f81051f..0ed6d859 100644
--- a/src/widgets/homebridge/proxy.js
+++ b/src/widgets/homebridge/proxy.js
@@ -10,7 +10,7 @@ const proxyName = "homebridgeProxyHandler";
 const sessionTokenCacheKey = `${proxyName}__sessionToken`;
 const logger = createLogger(proxyName);
 
-async function login(widget) {
+async function login(widget, service) {
   const endpoint = "auth/login";
   const api = widgets?.[widget.type]?.api
   const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
@@ -26,7 +26,7 @@ async function login(widget) {
   try {
     const { access_token: accessToken, expires_in: expiresIn } = JSON.parse(data.toString());
   
-    cache.put(sessionTokenCacheKey, accessToken, (expiresIn * 1000) - 5 * 60 * 1000); // expiresIn (s) - 5m
+    cache.put(`${sessionTokenCacheKey}.${service}`, accessToken, (expiresIn * 1000) - 5 * 60 * 1000); // expiresIn (s) - 5m
     return { accessToken };
   } catch (e) {
     logger.error("Unable to login to Homebridge API: %s", e);
@@ -35,10 +35,11 @@ async function login(widget) {
   return { accessToken: false };
 }
 
-async function apiCall(widget, endpoint) {
+async function apiCall(widget, endpoint, service) {
+  const key = `${sessionTokenCacheKey}.${service}`;
   const headers = {
     "content-type": "application/json",
-    "Authorization": `Bearer ${cache.get(sessionTokenCacheKey)}`,
+    "Authorization": `Bearer ${cache.get(key)}`,
   }
 
   const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
@@ -51,7 +52,7 @@ async function apiCall(widget, endpoint) {
 
   if (status === 401) {
     logger.debug("Homebridge API rejected the request, attempting to obtain new session token");
-    const { accessToken } = login(widget);
+    const { accessToken } = login(widget, service);
     headers.Authorization = `Bearer ${accessToken}`;
 
     // retry the request, now with the new session token
@@ -83,14 +84,14 @@ export default async function homebridgeProxyHandler(req, res) {
     return res.status(400).json({ error: "Invalid proxy service type" });
   }
 
-  if (!cache.get(sessionTokenCacheKey)) {
-    await login(widget);
+  if (!cache.get(`${sessionTokenCacheKey}.${service}`)) {
+    await login(widget, service);
   }
 
-  const { data: statusData } = await apiCall(widget, "status/homebridge");
-  const { data: versionData } = await apiCall(widget, "status/homebridge-version");
-  const { data: childBridgeData } = await apiCall(widget, "status/homebridge/child-bridges");
-  const { data: pluginsData } = await apiCall(widget, "plugins");
+  const { data: statusData } = await apiCall(widget, "status/homebridge", service);
+  const { data: versionData } = await apiCall(widget, "status/homebridge-version", service);
+  const { data: childBridgeData } = await apiCall(widget, "status/homebridge/child-bridges", service);
+  const { data: pluginsData } = await apiCall(widget, "plugins", service);
 
   return res.status(200).send({
       status: statusData?.status,
diff --git a/src/widgets/npm/proxy.js b/src/widgets/npm/proxy.js
index d6499e58..837a7743 100644
--- a/src/widgets/npm/proxy.js
+++ b/src/widgets/npm/proxy.js
@@ -10,7 +10,7 @@ const proxyName = "npmProxyHandler";
 const tokenCacheKey = `${proxyName}__token`;
 const logger = createLogger(proxyName);
 
-async function login(loginUrl, username, password) {
+async function login(loginUrl, username, password, service) {
   const authResponse = await httpProxy(loginUrl, {
     method: "POST",
     body: JSON.stringify({ identity: username, secret: password }),
@@ -27,7 +27,7 @@ async function login(loginUrl, username, password) {
     
     if (status === 200) {
       const expiration = new Date(data.expires) - Date.now();
-      cache.put(tokenCacheKey, data.token, expiration - (5 * 60 * 1000)); // expiration -5 minutes
+      cache.put(`${tokenCacheKey}.${service}`, data.token, expiration - (5 * 60 * 1000)); // expiration -5 minutes
     }
   } catch (e) {
     logger.error(`Error ${status} logging into npm`, authResponse[2]);
@@ -53,9 +53,9 @@ export default async function npmProxyHandler(req, res) {
       let contentType;
       let data;
       
-      let token = cache.get(tokenCacheKey);
+      let token = cache.get(`${tokenCacheKey}.${service}`);
       if (!token) {
-        [status, token] = await login(loginUrl, widget.username, widget.password);
+        [status, token] = await login(loginUrl, widget.username, widget.password, service);
         if (status !== 200) {
           logger.debug(`HTTTP ${status} logging into npm api: ${token}`);
           return res.status(status).send(token);
@@ -72,8 +72,8 @@ export default async function npmProxyHandler(req, res) {
 
       if (status === 403) {
         logger.debug(`HTTTP ${status} retrieving data from npm api, logging in and trying again.`);
-        cache.del(tokenCacheKey);
-        [status, token] = await login(loginUrl, widget.username, widget.password);
+        cache.del(`${tokenCacheKey}.${service}`);
+        [status, token] = await login(loginUrl, widget.username, widget.password, service);
 
         if (status !== 200) {
           logger.debug(`HTTTP ${status} logging into npm api: ${data}`);
diff --git a/src/widgets/plex/proxy.js b/src/widgets/plex/proxy.js
index b91b3533..e67bbaa2 100644
--- a/src/widgets/plex/proxy.js
+++ b/src/widgets/plex/proxy.js
@@ -58,6 +58,9 @@ async function fetchFromPlexAPI(endpoint, widget) {
 
 export default async function plexProxyHandler(req, res) {
   const widget = await getWidget(req);
+  
+  const { service } = req.query;
+
   if (!widget) {
     return res.status(400).json({ error: "Invalid proxy service type" });
   }
@@ -74,18 +77,18 @@ export default async function plexProxyHandler(req, res) {
     streams = apiData.MediaContainer._attributes.size;
   }
 
-  let libraries = cache.get(librariesCacheKey);
+  let libraries = cache.get(`${librariesCacheKey}.${service}`);
   if (libraries === null) {
     logger.debug("Getting libraries from Plex API");
     [status, apiData] = await fetchFromPlexAPI("/library/sections", widget);
     if (apiData && apiData.MediaContainer) {
       libraries = [].concat(apiData.MediaContainer.Directory);
-      cache.put(librariesCacheKey, libraries, 1000 * 60 * 60 * 6);
+      cache.put(`${librariesCacheKey}.${service}`, libraries, 1000 * 60 * 60 * 6);
     }
   }
 
-  let movies = cache.get(moviesCacheKey);
-  let tv = cache.get(tvCacheKey);
+  let movies = cache.get(`${moviesCacheKey}.${service}`);
+  let tv = cache.get(`${tvCacheKey}.${service}`);
   if (movies === null || tv === null) {
     movies = 0;
     tv = 0;
@@ -100,8 +103,8 @@ export default async function plexProxyHandler(req, res) {
           tv += size;
         }
       }
-      cache.put(tvCacheKey, tv, 1000 * 60 * 10);
-      cache.put(moviesCacheKey, movies, 1000 * 60 * 10);
+      cache.put(`${tvCacheKey}.${service}`, tv, 1000 * 60 * 10);
+      cache.put(`${moviesCacheKey}.${service}`, movies, 1000 * 60 * 10);
     });
   }
   
diff --git a/src/widgets/pyload/proxy.js b/src/widgets/pyload/proxy.js
index 4a866d9c..5a51c3b7 100644
--- a/src/widgets/pyload/proxy.js
+++ b/src/widgets/pyload/proxy.js
@@ -11,7 +11,7 @@ const logger = createLogger(proxyName);
 const sessionCacheKey = `${proxyName}__sessionId`;
 const isNgCacheKey = `${proxyName}__isNg`;
 
-async function fetchFromPyloadAPI(url, sessionId, params) {
+async function fetchFromPyloadAPI(url, sessionId, params, service) {
   const options = {
     body: params
       ? Object.keys(params)
@@ -25,10 +25,10 @@ async function fetchFromPyloadAPI(url, sessionId, params) {
   };
 
   // see https://github.com/benphelps/homepage/issues/517
-  const isNg = cache.get(isNgCacheKey);
+  const isNg = cache.get(`${isNgCacheKey}.${service}`);
   if (isNg && !params) {
     delete options.body;
-    options.headers.Cookie = cache.get(sessionCacheKey);
+    options.headers.Cookie = cache.get(`${sessionCacheKey}.${service}`);
   }
 
   // eslint-disable-next-line no-unused-vars
@@ -43,19 +43,19 @@ async function fetchFromPyloadAPI(url, sessionId, params) {
   return [status, returnData, responseHeaders];
 }
 
-async function login(loginUrl, username, password = '') {
-  const [status, sessionId, responseHeaders] = await fetchFromPyloadAPI(loginUrl, null, { username, password });
+async function login(loginUrl, service, username, password = '') {
+  const [status, sessionId, responseHeaders] = await fetchFromPyloadAPI(loginUrl, null, { username, password }, service);
   
   // this API actually returns status 200 even on login failure
   if (status !== 200 || sessionId === false) {
     logger.error(`HTTP ${status} logging into Pyload API, returned: ${JSON.stringify(sessionId)}`);
   } else if (responseHeaders['set-cookie']?.join().includes('pyload_session')) {
     // Support pyload-ng, see https://github.com/benphelps/homepage/issues/517
-    cache.put(isNgCacheKey, true);
+    cache.put(`${isNgCacheKey}.${service}`, true);
     const sessionCookie = responseHeaders['set-cookie'][0];
-    cache.put(sessionCacheKey, sessionCookie, 60 * 60 * 23 * 1000); // cache for 23h
+    cache.put(`${sessionCacheKey}.${service}`, sessionCookie, 60 * 60 * 23 * 1000); // cache for 23h
   } else {
-    cache.put(sessionCacheKey, sessionId);
+    cache.put(`${sessionCacheKey}.${service}`, sessionId);
   }
 
   return sessionId;
@@ -72,14 +72,14 @@ export default async function pyloadProxyHandler(req, res) {
         const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
         const loginUrl = `${widget.url}/api/login`;
 
-        let sessionId = cache.get(sessionCacheKey) ?? await login(loginUrl, widget.username, widget.password);
-        let [status, data] = await fetchFromPyloadAPI(url, sessionId);
+        let sessionId = cache.get(`${sessionCacheKey}.${service}`) ?? await login(loginUrl, service, widget.username, widget.password);
+        let [status, data] = await fetchFromPyloadAPI(url, sessionId, null, service);
 
         if (status === 403 || status === 401) {
           logger.info('Failed to retrieve data from Pyload API, trying to login again...');
-          cache.del(sessionCacheKey);
-          sessionId = await login(loginUrl, widget.username, widget.password);
-          [status, data] = await fetchFromPyloadAPI(url, sessionId);
+          cache.del(`${sessionCacheKey}.${service}`);
+          sessionId = await login(loginUrl, service, widget.username, widget.password);
+          [status, data] = await fetchFromPyloadAPI(url, sessionId, null, service);
         }
 
         if (data?.error || status !== 200) {
diff --git a/src/widgets/transmission/proxy.js b/src/widgets/transmission/proxy.js
index cdc1e9c9..83ca141e 100644
--- a/src/widgets/transmission/proxy.js
+++ b/src/widgets/transmission/proxy.js
@@ -25,12 +25,12 @@ export default async function transmissionProxyHandler(req, res) {
     return res.status(400).json({ error: "Invalid proxy service type" });
   }
 
-  let headers = cache.get(headerCacheKey);
+  let headers = cache.get(`${headerCacheKey}.${service}`);
   if (!headers) {
     headers = {
       "content-type": "application/json",
     }
-    cache.put(headerCacheKey, headers);
+    cache.put(`${headerCacheKey}.${service}`, headers);
   }
 
   const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
@@ -55,7 +55,7 @@ export default async function transmissionProxyHandler(req, res) {
   if (status === 409) {
     logger.debug("Transmission is rejecting the request, but returning a CSRF token");
     headers[csrfHeaderName] = responseHeaders[csrfHeaderName];
-    cache.put(headerCacheKey, headers);
+    cache.put(`${headerCacheKey}.${service}`, headers);
 
     // retry the request, now with the CSRF token
     [status, contentType, data, responseHeaders] = await httpProxy(url, {
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index abb5986f..9fbeafde 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -58,6 +58,7 @@ async function login(widget) {
 
 export default async function unifiProxyHandler(req, res) {
   const widget = await getWidget(req);
+  const { service } = req.query;
   if (!widget) {
     return res.status(400).json({ error: "Invalid proxy service type" });
   }
@@ -68,7 +69,7 @@ export default async function unifiProxyHandler(req, res) {
   }
 
   let [status, contentType, data, responseHeaders] = [];
-  let prefix = cache.get(prefixCacheKey);
+  let prefix = cache.get(`${prefixCacheKey}.${service}`);
   if (prefix === null) {
     // auto detect if we're talking to a UDM Pro, and cache the result so that we
     // don't make two requests each time data from Unifi is required
@@ -77,7 +78,7 @@ export default async function unifiProxyHandler(req, res) {
     if (responseHeaders?.["x-csrf-token"]) {
       prefix = udmpPrefix;
     }
-    cache.put(prefixCacheKey, prefix);
+    cache.put(`${prefixCacheKey}.${service}`, prefix);
   }
 
   widget.prefix = prefix;

From ccc12290980cafa476dc4fb82aa15e59d23ecdef Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 10 Dec 2022 08:42:32 -0800
Subject: [PATCH 005/347] fix intermittent loss of plex stats

closes #656
---
 src/widgets/plex/proxy.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/widgets/plex/proxy.js b/src/widgets/plex/proxy.js
index e67bbaa2..dc8bb717 100644
--- a/src/widgets/plex/proxy.js
+++ b/src/widgets/plex/proxy.js
@@ -93,7 +93,7 @@ export default async function plexProxyHandler(req, res) {
     movies = 0;
     tv = 0;
     logger.debug("Getting movie + tv counts from Plex API");
-    libraries.filter(l => ["movie", "show"].includes(l._attributes.type)).forEach(async (library) => {
+    await libraries.filter(l => ["movie", "show"].includes(l._attributes.type)).forEach(async (library) => {
       [status, apiData] = await fetchFromPlexAPI(`/library/sections/${library._attributes.key}/all`, widget);
       if (apiData && apiData.MediaContainer) {
         const size = parseInt(apiData.MediaContainer._attributes.size, 10);

From 146326f4278f9e5806eb5e3e22d5f19ec3b8ad69 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 10 Dec 2022 22:26:35 -0800
Subject: [PATCH 006/347] fix plex proxy async bug

---
 src/widgets/plex/proxy.js | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/widgets/plex/proxy.js b/src/widgets/plex/proxy.js
index dc8bb717..135b2b08 100644
--- a/src/widgets/plex/proxy.js
+++ b/src/widgets/plex/proxy.js
@@ -93,7 +93,8 @@ export default async function plexProxyHandler(req, res) {
     movies = 0;
     tv = 0;
     logger.debug("Getting movie + tv counts from Plex API");
-    await libraries.filter(l => ["movie", "show"].includes(l._attributes.type)).forEach(async (library) => {
+    const movieTVLibraries = libraries.filter(l => ["movie", "show"].includes(l._attributes.type));
+    await Promise.all(movieTVLibraries.map(async (library) => {
       [status, apiData] = await fetchFromPlexAPI(`/library/sections/${library._attributes.key}/all`, widget);
       if (apiData && apiData.MediaContainer) {
         const size = parseInt(apiData.MediaContainer._attributes.size, 10);
@@ -103,9 +104,9 @@ export default async function plexProxyHandler(req, res) {
           tv += size;
         }
       }
-      cache.put(`${tvCacheKey}.${service}`, tv, 1000 * 60 * 10);
-      cache.put(`${moviesCacheKey}.${service}`, movies, 1000 * 60 * 10);
-    });
+    }));
+    cache.put(`${tvCacheKey}.${service}`, tv, 1000 * 60 * 10);
+    cache.put(`${moviesCacheKey}.${service}`, movies, 1000 * 60 * 10);
   }
   
   const data = {

From fb883c7b27610ccd50dfe3b31db2962b93c7e7db Mon Sep 17 00:00:00 2001
From: Vinay Dawani <vdawani6@gmail.com>
Date: Sun, 11 Dec 2022 03:03:20 -0500
Subject: [PATCH 007/347] added yaml file variable for swarm mode checks

---
 src/pages/api/docker/stats/[...service].js  | 46 +++++++++++----------
 src/pages/api/docker/status/[...service].js | 46 +++++++++++----------
 src/utils/config/docker.js                  |  4 +-
 src/utils/config/service-helpers.js         |  4 +-
 4 files changed, 54 insertions(+), 46 deletions(-)

diff --git a/src/pages/api/docker/stats/[...service].js b/src/pages/api/docker/stats/[...service].js
index f5212aa6..0258bc68 100644
--- a/src/pages/api/docker/stats/[...service].js
+++ b/src/pages/api/docker/stats/[...service].js
@@ -14,7 +14,8 @@ export default async function handler(req, res) {
   }
 
   try {
-    const docker = new Docker(getDockerArguments(containerServer));
+    const dockerArgs = getDockerArguments(containerServer)
+    const docker = new Docker(dockerArgs.conn);
     const containers = await docker.listContainers({
       all: true,
     });
@@ -41,27 +42,30 @@ export default async function handler(req, res) {
       return;
     }
 
-    // Try with a service deployed in Docker Swarm
-    const tasks = await docker.listTasks({
-      filters: {
-        service: [containerName],
-        // A service can have several offline containers, so we only look for an active one.
-        'desired-state': ['running']
+    // Try with a service deployed in Docker Swarm, if enabled
+    if (dockerArgs.swarm) {
+      const tasks = await docker.listTasks({
+          filters: {
+            service: [containerName],
+            // A service can have several offline containers, so we only look for an active one.
+            "desired-state": ["running"],
+          },
+        })
+        .catch(() => []);
+
+      // For now we are only interested in the first one (in case replicas > 1).
+      // TODO: Show the result for all replicas/containers?
+      const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID;
+
+      if (taskContainerId) {
+        const container = docker.getContainer(taskContainerId);
+        const stats = await container.stats({ stream: false });
+
+        res.status(200).json({
+          stats,
+        });
+        return;
       }
-    }).catch(() => []);
-
-    // For now we are only interested in the first one (in case replicas > 1).
-    // TODO: Show the result for all replicas/containers?
-    const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID
-
-    if (taskContainerId) {
-      const container = docker.getContainer(taskContainerId);
-      const stats = await container.stats({ stream: false });
-
-      res.status(200).json({
-        stats,
-      });
-      return;
     }
 
     res.status(200).send({
diff --git a/src/pages/api/docker/status/[...service].js b/src/pages/api/docker/status/[...service].js
index 71635d1e..fa54e6f3 100644
--- a/src/pages/api/docker/status/[...service].js
+++ b/src/pages/api/docker/status/[...service].js
@@ -13,7 +13,8 @@ export default async function handler(req, res) {
   }
 
   try {
-    const docker = new Docker(getDockerArguments(containerServer));
+    const dockerArgs = getDockerArguments(containerServer);
+    const docker = new Docker(dockerArgs.conn);
     const containers = await docker.listContainers({
       all: true,
     });
@@ -35,30 +36,33 @@ export default async function handler(req, res) {
 
       return res.status(200).json({
         status: info.State.Status,
-        health: info.State.Health?.Status
+        health: info.State.Health?.Status,
       });
     }
 
-    const tasks = await docker.listTasks({
-      filters: {
-        service: [containerName],
-        // A service can have several offline containers, we only look for an active one.
-        'desired-state': ['running']
+    if (dockerArgs.swarm) {
+      const tasks = await docker.listTasks({
+          filters: {
+            service: [containerName],
+            // A service can have several offline containers, we only look for an active one.
+            "desired-state": ["running"],
+          },
+        })
+        .catch(() => []);
+
+      // For now we are only interested in the first one (in case replicas > 1).
+      // TODO: Show the result for all replicas/containers?
+      const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID;
+
+      if (taskContainerId) {
+        const container = docker.getContainer(taskContainerId);
+        const info = await container.inspect();
+
+        return res.status(200).json({
+          status: info.State.Status,
+          health: info.State.Health?.Status,
+        });
       }
-    }).catch(() => []);
-
-    // For now we are only interested in the first one (in case replicas > 1).
-    // TODO: Show the result for all replicas/containers?
-    const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID
-
-    if (taskContainerId) {
-      const container = docker.getContainer(taskContainerId);
-      const info = await container.inspect();
-
-      return res.status(200).json({
-        status: info.State.Status,
-        health: info.State.Health?.Status
-      });
     }
 
     return res.status(200).send({
diff --git a/src/utils/config/docker.js b/src/utils/config/docker.js
index 9aef7408..ada0c031 100644
--- a/src/utils/config/docker.js
+++ b/src/utils/config/docker.js
@@ -22,11 +22,11 @@ export default function getDockerArguments(server) {
 
   if (servers[server]) {
     if (servers[server].socket) {
-      return { socketPath: servers[server].socket };
+      return { conn: { socketPath: servers[server].socket }, swarm: servers[server].swarm };
     }
 
     if (servers[server].host) {
-      return { host: servers[server].host, port: servers[server].port || null };
+      return { conn: { host: servers[server].host, port: servers[server].port || null }, swarm: servers[server].swarm };
     }
 
     return servers[server];
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index e0a9f23f..46bda80f 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -44,7 +44,7 @@ export async function servicesFromDocker() {
 
   const serviceServers = await Promise.all(
     Object.keys(servers).map(async (serverName) => {
-      const docker = new Docker(getDockerArguments(serverName));
+      const docker = new Docker(getDockerArguments(serverName).conn);
       const containers = await docker.listContainers({
         all: true,
       });
@@ -167,4 +167,4 @@ export default async function getServiceWidget(group, service) {
   }
 
   return false;
-}
\ No newline at end of file
+}

From b7722ed33339cd3e7ada200965aefe849a127b40 Mon Sep 17 00:00:00 2001
From: Vinay Dawani <vdawani6@gmail.com>
Date: Sun, 11 Dec 2022 03:15:59 -0500
Subject: [PATCH 008/347] check swarm value before passing

---
 src/utils/config/docker.js | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/utils/config/docker.js b/src/utils/config/docker.js
index ada0c031..ee8559e0 100644
--- a/src/utils/config/docker.js
+++ b/src/utils/config/docker.js
@@ -22,11 +22,14 @@ export default function getDockerArguments(server) {
 
   if (servers[server]) {
     if (servers[server].socket) {
-      return { conn: { socketPath: servers[server].socket }, swarm: servers[server].swarm };
+      return { conn: { socketPath: servers[server].socket }, swarm: servers[server].swarm == true ? true : false };
     }
 
     if (servers[server].host) {
-      return { conn: { host: servers[server].host, port: servers[server].port || null }, swarm: servers[server].swarm };
+      return {
+        conn: { host: servers[server].host, port: servers[server].port || null },
+        swarm: servers[server].swarm == true ? true : false,
+      };
     }
 
     return servers[server];

From c720df0805c0b307b924788d5b93752ccc2a6af7 Mon Sep 17 00:00:00 2001
From: Vinay Dawani <vdawani6@gmail.com>
Date: Sun, 11 Dec 2022 04:01:06 -0500
Subject: [PATCH 009/347] double negation instead of ternary. force boolean

---
 src/utils/config/docker.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/utils/config/docker.js b/src/utils/config/docker.js
index ee8559e0..7e1422e0 100644
--- a/src/utils/config/docker.js
+++ b/src/utils/config/docker.js
@@ -22,13 +22,13 @@ export default function getDockerArguments(server) {
 
   if (servers[server]) {
     if (servers[server].socket) {
-      return { conn: { socketPath: servers[server].socket }, swarm: servers[server].swarm == true ? true : false };
+      return { conn: { socketPath: servers[server].socket }, swarm: !!servers[server].swarm };
     }
 
     if (servers[server].host) {
       return {
         conn: { host: servers[server].host, port: servers[server].port || null },
-        swarm: servers[server].swarm == true ? true : false,
+        swarm: !!servers[server].swarm,
       };
     }
 

From 645cf211dd199379cc4d4ae58b948677133127a1 Mon Sep 17 00:00:00 2001
From: Snekussaurier <valentin.schiffl@gmail.com>
Date: Sun, 11 Dec 2022 17:31:59 +0100
Subject: [PATCH 010/347] Add ability to use custom logo

---
 src/components/widgets/logo/logo.jsx | 107 +++++++++++++++------------
 1 file changed, 58 insertions(+), 49 deletions(-)

diff --git a/src/components/widgets/logo/logo.jsx b/src/components/widgets/logo/logo.jsx
index 198944b9..29ec3e2e 100644
--- a/src/components/widgets/logo/logo.jsx
+++ b/src/components/widgets/logo/logo.jsx
@@ -1,56 +1,65 @@
-export default function Logo() {
+import Image from "next/future/image";
+
+export default function Logo({ options }) {
   return (
     <div className="w-12 h-12 flex flex-row items-center align-middle mr-3 self-center">
-      <svg
-        xmlns="http://www.w3.org/2000/svg"
-        viewBox="0 0 1024 1024"
-        style={{
-          enableBackground: "new 0 0 1024 1024",
-        }}
-        xmlSpace="preserve"
-        className="w-full h-full"
-      >
-        <style>
-          {
-            ".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
-          }
-        </style>
-        <g id="Icon">
-          <path
-            d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
+      {options.source ?
+        <Image src={`${options.source}`} width={48} height={48} alt="logo" /> :
+
+        // if source parameter is not set, use fallback homepage logo
+        <div className="w-12 h-12 flex flex-row items-center align-middle mr-3 self-center">
+          <svg
+            xmlns="http://www.w3.org/2000/svg"
+            viewBox="0 0 1024 1024"
             style={{
-              fill: "rgba(var(--color-logo-start))",
+              enableBackground: "new 0 0 1024 1024",
             }}
-          />
-          <linearGradient
-            id="homepage_logo_gradient"
-            gradientUnits="userSpaceOnUse"
-            x1={200.746}
-            y1={225.015}
-            x2={764.986}
-            y2={789.255}
+            xmlSpace="preserve"
+            className="w-full h-full"
           >
-            <stop
-              offset={0}
-              style={{
-                stopColor: "rgba(var(--color-logo-start))",
-              }}
-            />
-            <stop
-              offset={1}
-              style={{
-                stopColor: "rgba(var(--color-logo-stop))",
-              }}
-            />
-          </linearGradient>
-          <path
-            d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
-            style={{
-              fill: "url(#homepage_logo_gradient)",
-            }}
-          />
-        </g>
-      </svg>
+            <style>
+              {
+                ".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
+              }
+            </style>
+            <g id="Icon">
+              <path
+                d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
+                style={{
+                  fill: "rgba(var(--color-logo-start))",
+                }}
+              />
+              <linearGradient
+                id="homepage_logo_gradient"
+                gradientUnits="userSpaceOnUse"
+                x1={200.746}
+                y1={225.015}
+                x2={764.986}
+                y2={789.255}
+              >
+                <stop
+                  offset={0}
+                  style={{
+                    stopColor: "rgba(var(--color-logo-start))",
+                  }}
+                />
+                <stop
+                  offset={1}
+                  style={{
+                    stopColor: "rgba(var(--color-logo-stop))",
+                  }}
+                />
+              </linearGradient>
+              <path
+                d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
+                style={{
+                  fill: "url(#homepage_logo_gradient)",
+                }}
+              />
+            </g>
+          </svg>
+        </div>
+      }
     </div>
-  );
+  )
 }

From 9188f5cdd90c28ca4cd9b0d7fe2967f0dcb46957 Mon Sep 17 00:00:00 2001
From: Vinay Dawani <vdawani6@gmail.com>
Date: Sun, 11 Dec 2022 12:49:23 -0500
Subject: [PATCH 011/347] cleanup

---
 src/pages/api/docker/stats/[...service].js | 2 +-
 src/utils/config/service-helpers.js        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/pages/api/docker/stats/[...service].js b/src/pages/api/docker/stats/[...service].js
index 0258bc68..82604f8c 100644
--- a/src/pages/api/docker/stats/[...service].js
+++ b/src/pages/api/docker/stats/[...service].js
@@ -14,7 +14,7 @@ export default async function handler(req, res) {
   }
 
   try {
-    const dockerArgs = getDockerArguments(containerServer)
+    const dockerArgs = getDockerArguments(containerServer);
     const docker = new Docker(dockerArgs.conn);
     const containers = await docker.listContainers({
       all: true,
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index 46bda80f..623b7d6b 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -167,4 +167,4 @@ export default async function getServiceWidget(group, service) {
   }
 
   return false;
-}
+}
\ No newline at end of file

From 95dcb8802a9aea9fe073169a81648fc69d78f02d Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 11 Dec 2022 10:30:04 -0800
Subject: [PATCH 012/347] Use ResolvedIcon, remove extra div

---
 src/components/resolvedicon.jsx      | 12 ++--
 src/components/widgets/logo/logo.jsx | 99 ++++++++++++++--------------
 2 files changed, 54 insertions(+), 57 deletions(-)

diff --git a/src/components/resolvedicon.jsx b/src/components/resolvedicon.jsx
index 2a3701e8..3dad2b0e 100644
--- a/src/components/resolvedicon.jsx
+++ b/src/components/resolvedicon.jsx
@@ -1,9 +1,9 @@
 import Image from "next/future/image";
 
-export default function ResolvedIcon({ icon }) {
+export default function ResolvedIcon({ icon, width = 32, height = 32 }) {
   // direct or relative URLs
   if (icon.startsWith("http") || icon.startsWith("/")) {
-    return <Image src={`${icon}`} width={32} height={32} alt="logo" />;
+    return <Image src={`${icon}`} width={width} height={height} alt="logo" />;
   }
 
   // mdi- prefixed, material design icons
@@ -12,8 +12,8 @@ export default function ResolvedIcon({ icon }) {
     return (
       <div
         style={{
-          width: 32,
-          height: 32,
+          width,
+          height,
           maxWidth: '100%',
           maxHeight: '100%',
           background: "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
@@ -29,8 +29,8 @@ export default function ResolvedIcon({ icon }) {
   return (
     <Image
       src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`}
-      width={32}
-      height={32}
+      width={width}
+      height={height}
       alt="logo"
     />
   );
diff --git a/src/components/widgets/logo/logo.jsx b/src/components/widgets/logo/logo.jsx
index 29ec3e2e..96e8569f 100644
--- a/src/components/widgets/logo/logo.jsx
+++ b/src/components/widgets/logo/logo.jsx
@@ -1,64 +1,61 @@
-import Image from "next/future/image";
+import ResolvedIcon from "components/resolvedicon"
 
 export default function Logo({ options }) {
   return (
     <div className="w-12 h-12 flex flex-row items-center align-middle mr-3 self-center">
-      {options.source ?
-        <Image src={`${options.source}`} width={48} height={48} alt="logo" /> :
-
-        // if source parameter is not set, use fallback homepage logo
-        <div className="w-12 h-12 flex flex-row items-center align-middle mr-3 self-center">
-          <svg
-            xmlns="http://www.w3.org/2000/svg"
-            viewBox="0 0 1024 1024"
-            style={{
-              enableBackground: "new 0 0 1024 1024",
-            }}
-            xmlSpace="preserve"
-            className="w-full h-full"
-          >
-            <style>
-              {
-                ".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
-              }
-            </style>
-            <g id="Icon">
-              <path
-                d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
+      {options.icon ?
+        <ResolvedIcon icon={options.icon} width={48} height={48} /> :
+        // fallback to homepage logo
+        <svg
+          xmlns="http://www.w3.org/2000/svg"
+          viewBox="0 0 1024 1024"
+          style={{
+            enableBackground: "new 0 0 1024 1024",
+          }}
+          xmlSpace="preserve"
+          className="w-full h-full"
+        >
+          <style>
+            {
+              ".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
+            }
+          </style>
+          <g id="Icon">
+            <path
+              d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
+              style={{
+                fill: "rgba(var(--color-logo-start))",
+              }}
+            />
+            <linearGradient
+              id="homepage_logo_gradient"
+              gradientUnits="userSpaceOnUse"
+              x1={200.746}
+              y1={225.015}
+              x2={764.986}
+              y2={789.255}
+            >
+              <stop
+                offset={0}
                 style={{
-                  fill: "rgba(var(--color-logo-start))",
+                  stopColor: "rgba(var(--color-logo-start))",
                 }}
               />
-              <linearGradient
-                id="homepage_logo_gradient"
-                gradientUnits="userSpaceOnUse"
-                x1={200.746}
-                y1={225.015}
-                x2={764.986}
-                y2={789.255}
-              >
-                <stop
-                  offset={0}
-                  style={{
-                    stopColor: "rgba(var(--color-logo-start))",
-                  }}
-                />
-                <stop
-                  offset={1}
-                  style={{
-                    stopColor: "rgba(var(--color-logo-stop))",
-                  }}
-                />
-              </linearGradient>
-              <path
-                d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
+              <stop
+                offset={1}
                 style={{
-                  fill: "url(#homepage_logo_gradient)",
+                  stopColor: "rgba(var(--color-logo-stop))",
                 }}
               />
-            </g>
-          </svg>
-        </div>
+            </linearGradient>
+            <path
+              d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
+              style={{
+                fill: "url(#homepage_logo_gradient)",
+              }}
+            />
+          </g>
+        </svg>
       }
     </div>
   )

From 6b55a50b05c53c7091ddd61ad74faa37c771f728 Mon Sep 17 00:00:00 2001
From: Luis Silva <lumitesi@gmail.com>
Date: Sun, 11 Dec 2022 01:28:35 +0000
Subject: [PATCH 013/347] Translated using Weblate (Portuguese)

Currently translated at 62.5% (164 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 52 +++++++++++++++++------------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 3cde6047..737a2b51 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -2,10 +2,10 @@
     "widget": {
         "missing_type": "Widget ausente: {{type}}",
         "api_error": "Erro da API",
-        "status": "Status",
+        "status": "Estado",
         "information": "Informação",
         "url": "Endereço URL",
-        "raw_error": "Raw Error",
+        "raw_error": "Erro",
         "response_data": "Dados da Resposta"
     },
     "search": {
@@ -207,9 +207,9 @@
         "wan": "WAN",
         "lan_users": "Utilizadores LAN",
         "wlan_users": "Utilizadores WLAN",
-        "up": "UP",
-        "down": "DOWN",
-        "wait": "Por favor aguarde",
+        "up": "Ligados",
+        "down": "Desligados",
+        "wait": "Por favor, aguarde",
         "lan": "LAN",
         "wlan": "WLAN",
         "devices": "Dispositivos",
@@ -224,32 +224,32 @@
     "glances": {
         "cpu": "CPU",
         "mem": "MEM",
-        "wait": "Please wait"
+        "wait": "Por favor, aguarde"
     },
     "changedetectionio": {
         "totalObserved": "Total Observado",
         "diffsDetected": "Diferenças Detetadas"
     },
     "wmo": {
-        "0-day": "Sunny",
-        "0-night": "Clear",
-        "1-day": "Mainly Sunny",
-        "1-night": "Mainly Clear",
-        "2-day": "Partly Cloudy",
-        "2-night": "Partly Cloudy",
-        "3-day": "Cloudy",
-        "3-night": "Cloudy",
+        "0-day": "Solarengo",
+        "0-night": "Limpo",
+        "1-day": "Maioritariamente ensolarado",
+        "1-night": "Maioritariamente Limpo",
+        "2-day": "Parcialmente Nublado",
+        "2-night": "Parcialmente nublado",
+        "3-day": "Nublado",
+        "3-night": "Nublado",
         "99-night": "Thunderstorm With Hail",
-        "45-day": "Foggy",
-        "45-night": "Foggy",
-        "48-day": "Foggy",
-        "48-night": "Foggy",
-        "51-day": "Light Drizzle",
-        "51-night": "Light Drizzle",
-        "53-day": "Drizzle",
-        "53-night": "Drizzle",
-        "55-day": "Heavy Drizzle",
-        "55-night": "Heavy Drizzle",
+        "45-day": "Nevoeiro",
+        "45-night": "Nevoeiro",
+        "48-day": "Nevoeiro",
+        "48-night": "Nevoeiro",
+        "51-day": "Aguaceiros",
+        "51-night": "Aguaceiros",
+        "53-day": "Chuvisco",
+        "53-night": "Chuvisco",
+        "55-day": "Aguaceiro Forte",
+        "55-night": "Aguaceiro Forte",
         "56-day": "Light Freezing Drizzle",
         "56-night": "Light Freezing Drizzle",
         "57-day": "Freezing Drizzle",
@@ -289,8 +289,8 @@
         "99-day": "Thunderstorm With Hail"
     },
     "quicklaunch": {
-        "bookmark": "Bookmark",
-        "service": "Service"
+        "bookmark": "Marcador",
+        "service": "Serviço"
     },
     "homebridge": {
         "available_update": "System",

From 7dd0b0e4ebad443aacb7309e3ac931f4e4d7c2aa Mon Sep 17 00:00:00 2001
From: guineu <guineuu@pm.me>
Date: Mon, 12 Dec 2022 15:14:45 +0000
Subject: [PATCH 014/347] Translated using Weblate (Catalan)

Currently translated at 100.0% (262 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 254 +++++++++++++++++-----------------
 1 file changed, 127 insertions(+), 127 deletions(-)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index dcf1ca70..38ad1dcb 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -3,10 +3,10 @@
         "missing_type": "Falta el tipus de widget: {{type}}",
         "api_error": "Error d'API",
         "status": "Estat",
-        "information": "Information",
+        "information": "Informació",
         "url": "URL",
-        "raw_error": "Raw Error",
-        "response_data": "Response Data"
+        "raw_error": "Error sense processar",
+        "response_data": "Dades de resposta"
     },
     "weather": {
         "allow": "Feu clic per permetre",
@@ -20,8 +20,8 @@
     "transmission": {
         "seed": "Llavors",
         "download": "Descàrrega",
-        "upload": "Càrrega",
-        "leech": "Companys"
+        "upload": "Pujada",
+        "leech": "Company"
     },
     "sonarr": {
         "wanted": "Volgut",
@@ -30,13 +30,13 @@
     },
     "speedtest": {
         "ping": "Ping",
-        "upload": "Càrrega",
+        "upload": "Pujada",
         "download": "Descàrrega"
     },
     "resources": {
         "total": "Total",
         "free": "Lliure",
-        "used": "Usat",
+        "used": "Utilitzat",
         "load": "Càrrega",
         "cpu": "CPU"
     },
@@ -47,13 +47,13 @@
         "cpu": "Processador",
         "offline": "Fora de línia",
         "error": "Error",
-        "unknown": "Unknown"
+        "unknown": "Desconegut"
     },
     "emby": {
         "playing": "Reproduint",
         "transcoding": "Transcodificant",
         "bitrate": "Taxa de bits",
-        "no_active": "Sense transmissions actives"
+        "no_active": "Sense reproduccions actives"
     },
     "tautulli": {
         "playing": "Reproduint",
@@ -73,14 +73,14 @@
     },
     "rutorrent": {
         "active": "Actiu",
-        "upload": "Càrrega",
+        "upload": "Pujada",
         "download": "Descàrrega"
     },
     "radarr": {
         "wanted": "Volgut",
         "queued": "En cua",
         "movies": "Pel·lícules",
-        "missing": "Missing"
+        "missing": "Faltant"
     },
     "readarr": {
         "wanted": "Volgut",
@@ -101,7 +101,7 @@
         "pending": "Pendent",
         "approved": "Aprovat",
         "available": "Disponible",
-        "processing": "Processing"
+        "processing": "Processant"
     },
     "pihole": {
         "queries": "Consultes",
@@ -163,8 +163,8 @@
     },
     "qbittorrent": {
         "download": "Descàrrega",
-        "upload": "Càrrega",
-        "leech": "Companys",
+        "upload": "Pujada",
+        "leech": "Company",
         "seed": "Llavors"
     },
     "mastodon": {
@@ -184,26 +184,26 @@
         "failedLoginsLast24H": "Errors d'inici de sessió (24h)"
     },
     "proxmox": {
-        "vms": "VMs",
+        "vms": "Màquines Virtuals",
         "mem": "Memòria",
         "cpu": "Processador",
         "lxc": "LXC"
     },
     "unifi": {
         "users": "Usuaris",
-        "uptime": "System Uptime",
-        "days": "Días",
+        "uptime": "Temps actiu",
+        "days": "Dies",
         "wan": "WAN",
-        "lan_users": "LAN Users",
-        "wlan_users": "WLAN Users",
-        "up": "UP",
-        "down": "DOWN",
+        "lan_users": "Usuaris LAN",
+        "wlan_users": "Usuaris WLAN",
+        "up": "ACTIU",
+        "down": "INACTIU",
         "wait": "Si us plau, espereu",
         "lan": "LAN",
         "wlan": "WLAN",
-        "devices": "Devices",
-        "lan_devices": "LAN Devices",
-        "wlan_devices": "WLAN Devices"
+        "devices": "Dispositius",
+        "lan_devices": "Dispositius LAN",
+        "wlan_devices": "Dispositius WLAN"
     },
     "plex": {
         "streams": "Transmissions actives",
@@ -216,119 +216,119 @@
         "wait": "Si us plau, espereu"
     },
     "changedetectionio": {
-        "totalObserved": "Total Observed",
-        "diffsDetected": "Diffs Detected"
+        "totalObserved": "Total d'observats",
+        "diffsDetected": "Diferències detectades"
     },
     "wmo": {
-        "66-day": "Freezing Rain",
-        "95-day": "Thunderstorm",
-        "95-night": "Thunderstorm",
-        "96-day": "Thunderstorm With Hail",
-        "0-day": "Sunny",
-        "0-night": "Clear",
-        "1-day": "Mainly Sunny",
-        "1-night": "Mainly Clear",
-        "2-day": "Partly Cloudy",
-        "2-night": "Partly Cloudy",
-        "3-day": "Cloudy",
-        "3-night": "Cloudy",
-        "45-day": "Foggy",
-        "45-night": "Foggy",
-        "48-day": "Foggy",
-        "48-night": "Foggy",
-        "51-day": "Light Drizzle",
-        "51-night": "Light Drizzle",
-        "53-day": "Drizzle",
-        "53-night": "Drizzle",
-        "55-day": "Heavy Drizzle",
-        "55-night": "Heavy Drizzle",
-        "56-day": "Light Freezing Drizzle",
-        "56-night": "Light Freezing Drizzle",
-        "65-night": "Heavy Rain",
-        "57-day": "Freezing Drizzle",
-        "57-night": "Freezing Drizzle",
-        "61-day": "Light Rain",
-        "61-night": "Light Rain",
-        "63-day": "Rain",
-        "63-night": "Rain",
-        "65-day": "Heavy Rain",
-        "66-night": "Freezing Rain",
-        "67-day": "Freezing Rain",
-        "67-night": "Freezing Rain",
-        "71-day": "Light Snow",
-        "71-night": "Light Snow",
-        "73-day": "Snow",
-        "73-night": "Snow",
-        "75-day": "Heavy Snow",
-        "75-night": "Heavy Snow",
-        "77-day": "Snow Grains",
-        "77-night": "Snow Grains",
-        "80-day": "Light Showers",
-        "80-night": "Light Showers",
-        "81-day": "Showers",
-        "81-night": "Showers",
-        "82-day": "Heavy Showers",
-        "82-night": "Heavy Showers",
-        "85-day": "Snow Showers",
-        "85-night": "Snow Showers",
-        "86-day": "Snow Showers",
-        "86-night": "Snow Showers",
-        "96-night": "Thunderstorm With Hail",
-        "99-day": "Thunderstorm With Hail",
-        "99-night": "Thunderstorm With Hail"
+        "66-day": "Pluja gelada",
+        "95-day": "Tempesta",
+        "95-night": "Tempesta",
+        "96-day": "Tempesta amb calamarsa",
+        "0-day": "Assolellat",
+        "0-night": "Cel clar",
+        "1-day": "Majorment assolellat",
+        "1-night": "Majorment clar",
+        "2-day": "Parcialment ennuvolat",
+        "2-night": "Parcialment ennuvolat",
+        "3-day": "Ennuvolat",
+        "3-night": "Ennuvolat",
+        "45-day": "Boirós",
+        "45-night": "Boirós",
+        "48-day": "Boirós",
+        "48-night": "Boirós",
+        "51-day": "Ruixats lleugers",
+        "51-night": "Ruixats lleugers",
+        "53-day": "Ruixat",
+        "53-night": "Ruxiat",
+        "55-day": "Ruixat intens",
+        "55-night": "Ruixat intens",
+        "56-day": "Lleuger ruixat gelat",
+        "56-night": "Lleuger ruixat gelat",
+        "65-night": "Pluja intensa",
+        "57-day": "Ruixat gelat",
+        "57-night": "Ruixat gelat",
+        "61-day": "Pluja lleugera",
+        "61-night": "Pluja lleugera",
+        "63-day": "Pluja",
+        "63-night": "Pluja",
+        "65-day": "Pluja intensa",
+        "66-night": "Pluja gelada",
+        "67-day": "Pluja gelada",
+        "67-night": "Pluja gelada",
+        "71-day": "Neu lleugera",
+        "71-night": "Neu lleugera",
+        "73-day": "Neu",
+        "73-night": "Neu",
+        "75-day": "Neu intensa",
+        "75-night": "Neu intensa",
+        "77-day": "Neu lleugera",
+        "77-night": "Neu lleugera",
+        "80-day": "Plovisqueig",
+        "80-night": "Plovisqueig",
+        "81-day": "Xàfecs",
+        "81-night": "Xàfecs",
+        "82-day": "Xàfecs intensos",
+        "82-night": "Xàfecs intensos",
+        "85-day": "Xàfecs de neu",
+        "85-night": "Xàfecs de neu",
+        "86-day": "Xàfecs de neu",
+        "86-night": "Xàfecs de neu",
+        "96-night": "Tempesta amb calamarsa",
+        "99-day": "Tempesta amb calamarsa",
+        "99-night": "Tempesta amb calamarsa"
     },
     "quicklaunch": {
-        "bookmark": "Bookmark",
-        "service": "Service"
+        "bookmark": "Marcador",
+        "service": "Servei"
     },
     "homebridge": {
-        "available_update": "System",
-        "updates": "Updates",
-        "update_available": "Update Available",
-        "up_to_date": "Up to Date",
+        "available_update": "Sistema",
+        "updates": "Actualitzacions",
+        "update_available": "Actualització disponible",
+        "up_to_date": "Actualitzat",
         "child_bridges": "Child Bridges",
         "child_bridges_status": "{{ok}}/{{total}}"
     },
     "autobrr": {
-        "approvedPushes": "Approved",
-        "rejectedPushes": "Rejected",
-        "filters": "Filters",
-        "indexers": "Indexers"
+        "approvedPushes": "Aprovat",
+        "rejectedPushes": "Rebutjat",
+        "filters": "Filtres",
+        "indexers": "Indexadors"
     },
     "watchtower": {
-        "containers_scanned": "Scanned",
-        "containers_updated": "Updated",
-        "containers_failed": "Failed"
+        "containers_scanned": "Escanejat",
+        "containers_updated": "Actualitzat",
+        "containers_failed": "Error"
     },
     "tubearchivist": {
-        "downloads": "Queue",
-        "videos": "Videos",
-        "channels": "Channels",
-        "playlists": "Playlists"
+        "downloads": "Cua",
+        "videos": "Vídeos",
+        "channels": "Canals",
+        "playlists": "Llistes de reproducció"
     },
     "truenas": {
-        "load": "System Load",
-        "uptime": "Uptime",
-        "alerts": "Alerts",
+        "load": "Càrrega del sistema",
+        "uptime": "Temps actiu",
+        "alerts": "Alertes",
         "time": "{{value, number(style: unit; unitDisplay: long;)}}"
     },
     "navidrome": {
-        "nothing_streaming": "No Active Streams",
-        "please_wait": "Please Wait"
+        "nothing_streaming": "Cap reproducció activa",
+        "please_wait": "Espereu si us plau"
     },
     "pyload": {
-        "speed": "Speed",
-        "active": "Active",
-        "queue": "Queue",
+        "speed": "Velocitat",
+        "active": "Actiu",
+        "queue": "Cua",
         "total": "Total"
     },
     "gluetun": {
-        "public_ip": "Public IP",
-        "region": "Region",
-        "country": "Country"
+        "public_ip": "IP Pública",
+        "region": "Regió",
+        "country": "País"
     },
     "hdhomerun": {
-        "channels": "Channels",
+        "channels": "Canals",
         "hd": "HD"
     },
     "ping": {
@@ -336,30 +336,30 @@
         "ping": "Ping"
     },
     "scrutiny": {
-        "passed": "Passed",
-        "failed": "Failed",
-        "unknown": "Unknown"
+        "passed": "Aprobat",
+        "failed": "Error",
+        "unknown": "Desconegut"
     },
     "paperlessngx": {
-        "inbox": "Inbox",
+        "inbox": "Safata d'entrada",
         "total": "Total"
     },
     "deluge": {
-        "seed": "Seed",
-        "download": "Download",
-        "upload": "Upload",
-        "leech": "Leech"
+        "seed": "Llavor",
+        "download": "Descàrrega",
+        "upload": "Pujada",
+        "leech": "Company"
     },
     "diskstation": {
-        "download": "Download",
-        "upload": "Upload",
-        "leech": "Leech",
-        "seed": "Seed"
+        "download": "Descàrrega",
+        "upload": "Pujada",
+        "leech": "Company",
+        "seed": "Llavor"
     },
     "flood": {
-        "download": "Download",
-        "upload": "Upload",
-        "leech": "Leech",
-        "seed": "Seed"
+        "download": "Descarregar",
+        "upload": "Pujada",
+        "leech": "Company",
+        "seed": "Llavor"
     }
 }

From e7b0fc1419f15057d38c09ebd8ab08eb53a44da7 Mon Sep 17 00:00:00 2001
From: Zack <weblate.org@zacky.org>
Date: Thu, 15 Dec 2022 16:06:11 +0000
Subject: [PATCH 015/347] Translated using Weblate (German)

Currently translated at 87.0% (228 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 76da6f02..fce2332c 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -6,7 +6,7 @@
         "url": "URL",
         "information": "Information",
         "raw_error": "Raw Error",
-        "response_data": "Response Data"
+        "response_data": "Empfangene Daten"
     },
     "search": {
         "placeholder": "Suche…"

From fb2492e57744d835df896559906da052771716a3 Mon Sep 17 00:00:00 2001
From: Luis Brito <luiseduardo14@gmail.com>
Date: Fri, 16 Dec 2022 14:38:48 -0300
Subject: [PATCH 016/347] Adds widget for NextDNS

---
 src/widgets/components.js         |  1 +
 src/widgets/nextdns/component.jsx | 31 +++++++++++++++++++++++++++++++
 src/widgets/nextdns/widget.js     | 17 +++++++++++++++++
 src/widgets/widgets.js            |  2 ++
 4 files changed, 51 insertions(+)
 create mode 100644 src/widgets/nextdns/component.jsx
 create mode 100644 src/widgets/nextdns/widget.js

diff --git a/src/widgets/components.js b/src/widgets/components.js
index b0752b62..552e4934 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -22,6 +22,7 @@ const components = {
   lidarr: dynamic(() => import("./lidarr/component")),
   mastodon: dynamic(() => import("./mastodon/component")),
   navidrome: dynamic(() => import("./navidrome/component")),
+  nextdns: dynamic(() => import("./nextdns/component")),
   npm: dynamic(() => import("./npm/component")),
   nzbget: dynamic(() => import("./nzbget/component")),
   ombi: dynamic(() => import("./ombi/component")),
diff --git a/src/widgets/nextdns/component.jsx b/src/widgets/nextdns/component.jsx
new file mode 100644
index 00000000..75ef04f0
--- /dev/null
+++ b/src/widgets/nextdns/component.jsx
@@ -0,0 +1,31 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: nextdnsData, error: nextdnsError } = useWidgetAPI(widget, "analytics/status");
+
+  if (nextdnsError) {
+    return <Container error={nextdnsError} />;
+  }
+
+  if (!nextdnsData) {
+    return (
+      <Container service={service}>
+        No data
+      </Container>
+    );
+  }
+
+  return (
+    <Container service={service}>
+      {nextdnsData?.data?.map(d => <Block key={d.status} label={d.status} value={t("common.number", { value: d.queries })} />)}
+    </Container>
+  );
+}
diff --git a/src/widgets/nextdns/widget.js b/src/widgets/nextdns/widget.js
new file mode 100644
index 00000000..012ef029
--- /dev/null
+++ b/src/widgets/nextdns/widget.js
@@ -0,0 +1,17 @@
+import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
+
+const widget = {
+  api: "https://api.nextdns.io/profiles/{profile}/{endpoint}",
+  proxyHandler: credentialedProxyHandler,
+
+  mappings: {
+    "analytics/status": {
+      endpoint: "analytics/status",
+      validate: [
+        "data",
+      ]
+    },
+  },
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index b3eaa885..e8998164 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -17,6 +17,7 @@ import jellyseerr from "./jellyseerr/widget";
 import lidarr from "./lidarr/widget";
 import mastodon from "./mastodon/widget";
 import navidrome from "./navidrome/widget";
+import nextdns from "./nextdns/widget";
 import npm from "./npm/widget";
 import nzbget from "./nzbget/widget";
 import ombi from "./ombi/widget";
@@ -66,6 +67,7 @@ const widgets = {
   lidarr,
   mastodon,
   navidrome,
+  nextdns,
   npm,
   nzbget,
   ombi,

From aaa1f761767abaf93c98e442ecbcbabf1926b87f Mon Sep 17 00:00:00 2001
From: Rickey Shideler <rdshideler@gmail.com>
Date: Fri, 16 Dec 2022 18:31:26 +0000
Subject: [PATCH 017/347] added tdarr widget

---
 public/locales/en/common.json   |  6 ++++
 src/widgets/components.js       |  1 +
 src/widgets/tdarr/component.jsx | 45 +++++++++++++++++++++++++
 src/widgets/tdarr/proxy.js      | 58 +++++++++++++++++++++++++++++++++
 src/widgets/tdarr/widget.js     |  8 +++++
 src/widgets/widgets.js          |  2 ++
 6 files changed, 120 insertions(+)
 create mode 100644 src/widgets/tdarr/component.jsx
 create mode 100644 src/widgets/tdarr/proxy.js
 create mode 100644 src/widgets/tdarr/widget.js

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 80ba5357..6466727f 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -192,6 +192,12 @@
         "stopped": "Stopped",
         "total": "Total"
     },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
+    },     
     "traefik": {
         "routers": "Routers",
         "services": "Services",
diff --git a/src/widgets/components.js b/src/widgets/components.js
index b0752b62..e6021f17 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -43,6 +43,7 @@ const components = {
   speedtest: dynamic(() => import("./speedtest/component")),
   strelaysrv: dynamic(() => import("./strelaysrv/component")),
   tautulli: dynamic(() => import("./tautulli/component")),
+  tdarr: dynamic(() => import("./tdarr/component")),
   traefik: dynamic(() => import("./traefik/component")),
   transmission: dynamic(() => import("./transmission/component")),
   tubearchivist: dynamic(() => import("./tubearchivist/component")),
diff --git a/src/widgets/tdarr/component.jsx b/src/widgets/tdarr/component.jsx
new file mode 100644
index 00000000..34e18a97
--- /dev/null
+++ b/src/widgets/tdarr/component.jsx
@@ -0,0 +1,45 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: tdarrData, error: tdarrError } = useWidgetAPI(widget);
+
+  if (tdarrError) {
+    return <Container error={tdarrError} />;
+  }
+
+  if (!tdarrData) {
+    return (
+      <Container service={service}>
+        <Block label="tdarr.queue" />
+        <Block label="tdarr.processed" />
+        <Block label="tdarr.errored" />
+        <Block label="tdarr.saved" />
+      </Container>
+    );
+  }
+
+  // const { torrents } = tdarrData.arguments;
+
+  const queue = parseInt(tdarrData.table1Count) + parseInt(tdarrData.table4Count);
+  const processed = parseInt(tdarrData.table2Count) + parseInt(tdarrData.table5Count);
+  const errored = parseInt(tdarrData.table3Count) + parseInt(tdarrData.table6Count);
+
+  const saved = parseFloat(tdarrData.sizeDiff) * 1000000000;
+
+  return (
+    <Container service={service}>
+      <Block label="tdarr.queue" value={t("common.number", { value: queue })} />
+      <Block label="tdarr.processed" value={t("common.number", { value: processed })} />
+      <Block label="tdarr.errored" value={t("common.number", { value: errored })} />
+      <Block label="tdarr.saved" value={t("common.bytes", { value: saved })} />    
+    </Container>
+  );
+}
diff --git a/src/widgets/tdarr/proxy.js b/src/widgets/tdarr/proxy.js
new file mode 100644
index 00000000..161d7629
--- /dev/null
+++ b/src/widgets/tdarr/proxy.js
@@ -0,0 +1,58 @@
+import { httpProxy } from "utils/proxy/http";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
+import widgets from "widgets/widgets";
+
+const proxyName = "tdarrProxyHandler";
+const logger = createLogger(proxyName);
+
+export default async function tdarrProxyHandler(req, res) {
+  const { group, service, endpoint } = req.query;
+
+  if (!group || !service) {
+    logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
+    return res.status(400).json({ error: "Invalid proxy service type" });
+  }
+
+  const widget = await getServiceWidget(group, service);
+
+  if (!widget) {
+    logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
+    return res.status(400).json({ error: "Invalid proxy service type" });
+  }
+
+
+
+
+  const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
+
+  const method = "POST";
+  
+  const headers = {
+    "content-type": "application/json",
+  };
+
+  const body = JSON.stringify({
+    "data": {
+      "collection": "StatisticsJSONDB",
+      "mode": "getById",
+      "docID": "statistics"
+    }
+  });
+
+  let [status, contentType, data, responseHeaders] = await httpProxy(url, {
+    method,
+    body,
+    headers,
+  });
+
+
+  if (status !== 200) {
+    logger.error("Error getting data from Tdarr: %d.  Data: %s", status, data);
+    return res.status(500).send({error: {message:"Error getting data from Tdarr", url, data}});
+  }
+
+  if (contentType) res.setHeader("Content-Type", contentType);
+  return res.status(status).send(data);
+}
diff --git a/src/widgets/tdarr/widget.js b/src/widgets/tdarr/widget.js
new file mode 100644
index 00000000..f26713f2
--- /dev/null
+++ b/src/widgets/tdarr/widget.js
@@ -0,0 +1,8 @@
+import tdarrProxyHandler from "./proxy";
+
+const widget = {
+  api: "{url}/api/v2/cruddb",
+  proxyHandler: tdarrProxyHandler,
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index b3eaa885..cda52cc0 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -38,6 +38,7 @@ import sonarr from "./sonarr/widget";
 import speedtest from "./speedtest/widget";
 import strelaysrv from "./strelaysrv/widget";
 import tautulli from "./tautulli/widget";
+import tdarr from "./tdarr/widget";
 import traefik from "./traefik/widget";
 import transmission from "./transmission/widget";
 import tubearchivist from "./tubearchivist/widget";
@@ -87,6 +88,7 @@ const widgets = {
   speedtest,
   strelaysrv,
   tautulli,
+  tdarr,
   traefik,
   transmission,
   tubearchivist,

From 12ed730897ed0ec4656781a769936e591b10519e Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 16 Dec 2022 13:49:33 -0800
Subject: [PATCH 018/347] Code cleanup + lint

---
 src/widgets/tdarr/component.jsx | 11 ++++-------
 src/widgets/tdarr/proxy.js      | 34 ++++++++++++---------------------
 2 files changed, 16 insertions(+), 29 deletions(-)

diff --git a/src/widgets/tdarr/component.jsx b/src/widgets/tdarr/component.jsx
index 34e18a97..5e96bf48 100644
--- a/src/widgets/tdarr/component.jsx
+++ b/src/widgets/tdarr/component.jsx
@@ -26,13 +26,10 @@ export default function Component({ service }) {
     );
   }
 
-  // const { torrents } = tdarrData.arguments;
-
-  const queue = parseInt(tdarrData.table1Count) + parseInt(tdarrData.table4Count);
-  const processed = parseInt(tdarrData.table2Count) + parseInt(tdarrData.table5Count);
-  const errored = parseInt(tdarrData.table3Count) + parseInt(tdarrData.table6Count);
-
-  const saved = parseFloat(tdarrData.sizeDiff) * 1000000000;
+  const queue = parseInt(tdarrData.table1Count, 10) + parseInt(tdarrData.table4Count, 10);
+  const processed = parseInt(tdarrData.table2Count, 10) + parseInt(tdarrData.table5Count, 10);
+  const errored = parseInt(tdarrData.table3Count, 10) + parseInt(tdarrData.table6Count, 10);
+  const saved = parseFloat(tdarrData.sizeDiff, 10) * 1000000000;
 
   return (
     <Container service={service}>
diff --git a/src/widgets/tdarr/proxy.js b/src/widgets/tdarr/proxy.js
index 161d7629..7f7dd803 100644
--- a/src/widgets/tdarr/proxy.js
+++ b/src/widgets/tdarr/proxy.js
@@ -22,32 +22,22 @@ export default async function tdarrProxyHandler(req, res) {
     return res.status(400).json({ error: "Invalid proxy service type" });
   }
 
-
-
-
   const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
 
-  const method = "POST";
-  
-  const headers = {
-    "content-type": "application/json",
-  };
-
-  const body = JSON.stringify({
-    "data": {
-      "collection": "StatisticsJSONDB",
-      "mode": "getById",
-      "docID": "statistics"
-    }
+  const [status, contentType, data] = await httpProxy(url, {
+    method: "POST",
+    body: JSON.stringify({
+      "data": {
+        "collection": "StatisticsJSONDB",
+        "mode": "getById",
+        "docID": "statistics"
+      },
+    }),
+    headers: {
+      "content-type": "application/json",
+    },
   });
 
-  let [status, contentType, data, responseHeaders] = await httpProxy(url, {
-    method,
-    body,
-    headers,
-  });
-
-
   if (status !== 200) {
     logger.error("Error getting data from Tdarr: %d.  Data: %s", status, data);
     return res.status(500).send({error: {message:"Error getting data from Tdarr", url, data}});

From 32ef47e6d276d8342a8ee98df1a6502760d6c7d4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:03 +0000
Subject: [PATCH 019/347] Translated using Weblate (German)

Currently translated at 85.7% (228 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index fce2332c..61083c81 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From cd2b9d2e0a95548eb77faaa60c0ed5600b020da4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:04 +0000
Subject: [PATCH 020/347] Translated using Weblate (Spanish)

Currently translated at 98.4% (262 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 1eaceaa4..bda73e4c 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -361,5 +361,11 @@
         "upload": "Subir",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "saved": "Saved",
+        "errored": "Errored"
     }
 }

From 6d97ac77f6384b7ed072ad425103c0238ca6e96e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:04 +0000
Subject: [PATCH 021/347] Translated using Weblate (French)

Currently translated at 98.4% (262 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 34a15897..c8fcceba 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -361,5 +361,11 @@
         "upload": "Envoi",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 0ab988119dee1fac81ef6c59e10962d5a271c13f Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:04 +0000
Subject: [PATCH 022/347] Translated using Weblate (Portuguese)

Currently translated at 61.6% (164 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 737a2b51..faf6bc9a 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -372,5 +372,11 @@
         "upload": "Carregar",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From d73430b299d7dd6b2f61ef712f28c1d86952e3f7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:04 +0000
Subject: [PATCH 023/347] Translated using Weblate (Russian)

Currently translated at 18.0% (48 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 1b7688ea..c9bf359a 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -361,5 +361,11 @@
         "download": "Download",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 7606763cc6aa5b5d517fdb0ae59262f7effb485d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:05 +0000
Subject: [PATCH 024/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 63.1% (168 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index 512fbcc1..621544e2 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -361,5 +361,11 @@
         "download": "Download",
         "upload": "Upload",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "saved": "Saved",
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored"
     }
 }

From 5f33f061cc835b07117709a3257da4549a06c33d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:05 +0000
Subject: [PATCH 025/347] Translated using Weblate (Italian)

Currently translated at 86.0% (229 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 169e42bd..5c313f94 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 64a77ce04f00caac0d8b778974d4301fe130df41 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:03 +0000
Subject: [PATCH 026/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 29.6% (79 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 8a6d7965..c0177996 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 0a260db335fcbf951e443293489329a30943b353 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:05 +0000
Subject: [PATCH 027/347] Translated using Weblate (Vietnamese)

Currently translated at 16.5% (44 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index e01e4fd4..8ccc733a 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "seed": "Seed",
         "leech": "Leech"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From d72cbb79f57aed3382dea1d12c051b366f873a88 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:06 +0000
Subject: [PATCH 028/347] Translated using Weblate (Dutch)

Currently translated at 23.6% (63 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 9a16f6d8..882b6fa1 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 39e276644fdc7d2aa1e089eb4217f86a7e40bfec Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:06 +0000
Subject: [PATCH 029/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.3% (9 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index f760d795..2ea85055 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From e8d50201a5e0e6769ed405602dbf151406295d87 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:58 +0000
Subject: [PATCH 030/347] Translated using Weblate (Catalan)

Currently translated at 98.4% (262 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 38ad1dcb..21535214 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -361,5 +361,11 @@
         "upload": "Pujada",
         "leech": "Company",
         "seed": "Llavor"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 97550a67b75dd75245c0d5921bdd251ef5e829f4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:01 +0000
Subject: [PATCH 031/347] Translated using Weblate (Polish)

Currently translated at 96.9% (258 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index c4accc5a..f19b7eb2 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -361,5 +361,11 @@
         "upload": "Wysyłanie",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 86485740eb85d12e75291e6c4d5144dfe2d09176 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:57 +0000
Subject: [PATCH 032/347] Translated using Weblate (Swedish)

Currently translated at 48.8% (130 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index e670291b..d0ef742d 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From d7f06dbfbb32075cac8a873133b0be7d501129a4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:57 +0000
Subject: [PATCH 033/347] Translated using Weblate (Croatian)

Currently translated at 96.2% (256 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 58539904..f64de9bc 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -361,5 +361,11 @@
         "upload": "Prijenos",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 4b38db6380bf5344b502086887c6799a4e804969 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:58 +0000
Subject: [PATCH 034/347] Translated using Weblate (Hungarian)

Currently translated at 40.6% (108 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 6ad93d4a..8bd676c0 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From e1d835259d67d99889d4bd409e388df1dea36f9c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:57 +0000
Subject: [PATCH 035/347] Translated using Weblate (Hebrew)

Currently translated at 37.9% (101 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 53439ae0..6fd7d10d 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 1168b301ddb8fdaef6591198a3f7702ffc2cc137 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:59 +0000
Subject: [PATCH 036/347] Translated using Weblate (Romanian)

Currently translated at 51.5% (137 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 6c2a635f..825b8fa5 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From c6677d55da2733a93dd25b2989c047df64102f21 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:00 +0000
Subject: [PATCH 037/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 43.9% (117 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 0bfa8ecc..b5205c1e 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 92a5e20c7e80fc63d1ab3563bc5a6947f2388039 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:58 +0000
Subject: [PATCH 038/347] Translated using Weblate (Yue)

Currently translated at 44.3% (118 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 80e3a788..ae4dd999 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 540189682940c1938cde5f73fe25975cada33432 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:02 +0000
Subject: [PATCH 039/347] Translated using Weblate (Finnish)

Currently translated at 46.2% (123 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 54ac45c4..956586cf 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 411ca43729bc95d9fe125d70c2f1418e5d40d003 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:01 +0000
Subject: [PATCH 040/347] Translated using Weblate (Telugu)

Currently translated at 81.5% (217 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 85effa8d..da396145 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From aed29762fd17119d508abbff82fb03b4eec4f726 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:02 +0000
Subject: [PATCH 041/347] Translated using Weblate (Bulgarian)

Currently translated at 17.2% (46 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index abbd3cca..e267a357 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -361,5 +361,11 @@
         "seed": "Seed",
         "download": "Download",
         "upload": "Upload"
+    },
+    "tdarr": {
+        "saved": "Saved",
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored"
     }
 }

From a6599b1ea093b3045dd0f6cb04b5d2b313049246 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:59 +0000
Subject: [PATCH 042/347] Translated using Weblate (Turkish)

Currently translated at 86.8% (231 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 5312035f..53d34c64 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 41ce91cf81be21d57d6cf0a5ea5eb50dbff20362 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:01 +0000
Subject: [PATCH 043/347] Translated using Weblate (Serbian)

Currently translated at 3.3% (9 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 6b03fa0f..4b7fbc9f 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -361,5 +361,11 @@
         "seed": "Seed",
         "upload": "Upload",
         "leech": "Leech"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 5f116226cfa234b7339ec697ed74ff6a86d27870 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:50:59 +0000
Subject: [PATCH 044/347] Translated using Weblate (Arabic)

Currently translated at 16.5% (44 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index cfe661e6..c6aa6493 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From db9afd4d7c0b335b3b4ba77b5372e0931245205e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:03 +0000
Subject: [PATCH 045/347] Translated using Weblate (Czech)

Currently translated at 84.5% (225 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 66da71bd..d1b573f6 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 0a2528d47658f5b6a79e060f2b30450fb5f660dc Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:02 +0000
Subject: [PATCH 046/347] Translated using Weblate (Danish)

Currently translated at 74.4% (198 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index fae5a68c..b172c8c5 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -361,5 +361,11 @@
         "download": "Download",
         "upload": "Upload",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 17b21eb029d5b6ff0f3e29ebd182da6ca2a81c67 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:06 +0000
Subject: [PATCH 047/347] Translated using Weblate (Malay)

Currently translated at 95.1% (253 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 5bb77f76..a081183d 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 80cc9fc984b257698b6377699510267647938027 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:00 +0000
Subject: [PATCH 048/347] Translated using Weblate (Hindi)

Currently translated at 3.3% (9 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index e2f5091b..4bb57aeb 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From 82486d1e13e34f426953dfc4010bfc3f5876dda8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 16 Dec 2022 21:51:00 +0000
Subject: [PATCH 049/347] Translated using Weblate (Esperanto)

Currently translated at 38.7% (103 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index c8a23676..ea57cd80 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -361,5 +361,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
     }
 }

From f7d5582f5789e7e6e50d0a4ca52927cbca339f94 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 16 Dec 2022 14:24:32 -0800
Subject: [PATCH 050/347] Handle nextdns no devices setup, data pending

---
 public/locales/en/common.json     |  4 ++++
 src/widgets/nextdns/component.jsx | 12 ++++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 80ba5357..6081a71e 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -372,5 +372,9 @@
     "paperlessngx": {
         "inbox": "Inbox",
         "total": "Total"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }
\ No newline at end of file
diff --git a/src/widgets/nextdns/component.jsx b/src/widgets/nextdns/component.jsx
index 75ef04f0..ae239770 100644
--- a/src/widgets/nextdns/component.jsx
+++ b/src/widgets/nextdns/component.jsx
@@ -18,14 +18,22 @@ export default function Component({ service }) {
   if (!nextdnsData) {
     return (
       <Container service={service}>
-        No data
+        <Block key="status" label="widget.status" value={t("nextdns.wait")} />
+      </Container>
+    );
+  }
+
+  if (!nextdnsData?.data?.length) {
+    return (
+      <Container service={service}>
+        <Block key="status" label="widget.status" value={t("nextdns.no_devices")} />
       </Container>
     );
   }
 
   return (
     <Container service={service}>
-      {nextdnsData?.data?.map(d => <Block key={d.status} label={d.status} value={t("common.number", { value: d.queries })} />)}
+      {nextdnsData.data.map(d => <Block key={d.status} label={d.status} value={t("common.number", { value: d.queries })} />)}
     </Container>
   );
 }

From db46931246cbf5484c1eb50f55c60374cca2d6e3 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 16 Dec 2022 22:32:28 -0800
Subject: [PATCH 051/347] Allow map in credentialedproxy

---
 src/utils/proxy/handlers/credentialed.js | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index 38d09ccb..4d2007ba 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -7,7 +7,7 @@ import widgets from "widgets/widgets";
 
 const logger = createLogger("credentialedProxyHandler");
 
-export default async function credentialedProxyHandler(req, res) {
+export default async function credentialedProxyHandler(req, res, map) {
   const { group, service, endpoint } = req.query;
 
   if (group && service) {
@@ -47,6 +47,8 @@ export default async function credentialedProxyHandler(req, res) {
         headers,
       });
 
+      let resultData = data;
+
       if (status === 204 || status === 304) {
         return res.status(status).end();
       }
@@ -59,8 +61,12 @@ export default async function credentialedProxyHandler(req, res) {
         return res.status(500).json({error: {message: "Invalid data", url, data}});
       }
 
+      if (status === 200 && map) {
+        resultData = map(data);
+      }
+
       if (contentType) res.setHeader("Content-Type", contentType);
-      return res.status(status).send(data);
+      return res.status(status).send(resultData);
     }
   }
 

From 3bef3dd6c6d79e3ed8304151f1045ada3c2d96a1 Mon Sep 17 00:00:00 2001
From: Heng-Yi Wu <2316687+henry40408@users.noreply.github.com>
Date: Tue, 6 Dec 2022 21:33:45 +0800
Subject: [PATCH 052/347] feat: miniflux widget

---
 public/locales/en/common.json      |  6 +++-
 src/widgets/components.js          |  1 +
 src/widgets/miniflux/component.jsx | 33 ++++++++++++++++++++++
 src/widgets/miniflux/proxy.js      | 45 ++++++++++++++++++++++++++++++
 src/widgets/miniflux/widget.js     |  7 +++++
 src/widgets/widgets.js             |  2 ++
 6 files changed, 93 insertions(+), 1 deletion(-)
 create mode 100644 src/widgets/miniflux/component.jsx
 create mode 100644 src/widgets/miniflux/proxy.js
 create mode 100644 src/widgets/miniflux/widget.js

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 6466727f..3681f9de 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -246,6 +246,10 @@
         "status_count": "Posts",
         "domain_count": "Domains"
     },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
+    },
     "authentik": {
         "users": "Users",
         "loginsLast24H": "Logins (24h)",
@@ -379,4 +383,4 @@
         "inbox": "Inbox",
         "total": "Total"
     }
-}
\ No newline at end of file
+}
diff --git a/src/widgets/components.js b/src/widgets/components.js
index e6021f17..0ecce683 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -21,6 +21,7 @@ const components = {
   jellyseerr: dynamic(() => import("./jellyseerr/component")),
   lidarr: dynamic(() => import("./lidarr/component")),
   mastodon: dynamic(() => import("./mastodon/component")),
+  miniflux: dynamic(() => import("./miniflux/component")),
   navidrome: dynamic(() => import("./navidrome/component")),
   npm: dynamic(() => import("./npm/component")),
   nzbget: dynamic(() => import("./nzbget/component")),
diff --git a/src/widgets/miniflux/component.jsx b/src/widgets/miniflux/component.jsx
new file mode 100644
index 00000000..e68419e0
--- /dev/null
+++ b/src/widgets/miniflux/component.jsx
@@ -0,0 +1,33 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: minifluxData, error: minifluxError } = useWidgetAPI(widget);
+
+  if (minifluxError) {
+    return <Container error={minifluxError} />;
+  }
+
+  if (!minifluxData) {
+    return (
+      <Container service={service}>
+        <Block label="miniflux.unread" />
+        <Block label="miniflux.read" />
+      </Container>
+    );
+  }
+
+  return (
+    <Container service={service}>
+      <Block label="miniflux.unread" value={t("common.number", { value: minifluxData.unread })} />
+      <Block label="miniflux.read" value={t("common.number", { value: minifluxData.read })} />
+    </Container>
+  );
+}
diff --git a/src/widgets/miniflux/proxy.js b/src/widgets/miniflux/proxy.js
new file mode 100644
index 00000000..9e6ac951
--- /dev/null
+++ b/src/widgets/miniflux/proxy.js
@@ -0,0 +1,45 @@
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
+import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
+
+const logger = createLogger("minifluxProxyHandler");
+
+export default async function minifluxProxyHandler(req, res) {
+  const { group, service } = req.query;
+
+  if (!group || !service) {
+    logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
+    return res.status(400).json({ error: "Invalid proxy service type" });
+  }
+
+  const widget = await getServiceWidget(group, service);
+  if (!widget) {
+    logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
+    return res.status(400).json({ error: "Invalid proxy service type" });
+  }
+
+  const url = new URL(formatApiCall("{url}/v1/feeds/counters", { ...widget }));
+  url.username = widget.username;
+  url.password = widget.password;
+
+  const params = {
+    method: "GET",
+    headers: {
+      "X-Auth-Token": widget.token
+    }
+  };
+
+  // eslint-disable-next-line no-unused-vars
+  const [status, contentType, data] = await httpProxy(url, params);
+
+  let read = 0;
+  let unread = 0;
+  if (status === 200) {
+    const parsed = JSON.parse(data.toString());
+    read = Object.values(parsed.reads).reduce((acc, i) => acc + i, 0);
+    unread = Object.values(parsed.unreads).reduce((acc, i) => acc + i, 0);
+  }
+
+  return res.status(status).send({ read, unread });
+}
diff --git a/src/widgets/miniflux/widget.js b/src/widgets/miniflux/widget.js
new file mode 100644
index 00000000..d98fee40
--- /dev/null
+++ b/src/widgets/miniflux/widget.js
@@ -0,0 +1,7 @@
+import minifluxProxyHandler from "./proxy";
+
+const widget = {
+  proxyHandler: minifluxProxyHandler,
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index cda52cc0..7bb3c95d 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -16,6 +16,7 @@ import jackett from "./jackett/widget";
 import jellyseerr from "./jellyseerr/widget";
 import lidarr from "./lidarr/widget";
 import mastodon from "./mastodon/widget";
+import miniflux from "./miniflux/widget";
 import navidrome from "./navidrome/widget";
 import npm from "./npm/widget";
 import nzbget from "./nzbget/widget";
@@ -66,6 +67,7 @@ const widgets = {
   jellyseerr,
   lidarr,
   mastodon,
+  miniflux,
   navidrome,
   npm,
   nzbget,

From 93445a28316fadd90e96f0f8a050ef52adb6e8a8 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 16 Dec 2022 22:33:15 -0800
Subject: [PATCH 053/347] Use credentialed proxy for miniflux

---
 src/utils/proxy/handlers/credentialed.js |  2 ++
 src/widgets/miniflux/component.jsx       |  2 +-
 src/widgets/miniflux/proxy.js            | 45 ------------------------
 src/widgets/miniflux/widget.js           | 16 +++++++--
 4 files changed, 17 insertions(+), 48 deletions(-)
 delete mode 100644 src/widgets/miniflux/proxy.js

diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index 4d2007ba..5d34264d 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -36,6 +36,8 @@ export default async function credentialedProxyHandler(req, res, map) {
         headers["X-API-Token"] = `${widget.key}`;
       } else if (widget.type === "tubearchivist") {
         headers.Authorization = `Token ${widget.key}`;
+      } else if (widget.type === "miniflux") {
+        headers["X-Auth-Token"] = `${widget.key}`;
       } else {
         headers["X-API-Key"] = `${widget.key}`;
       }
diff --git a/src/widgets/miniflux/component.jsx b/src/widgets/miniflux/component.jsx
index e68419e0..dbfd6048 100644
--- a/src/widgets/miniflux/component.jsx
+++ b/src/widgets/miniflux/component.jsx
@@ -9,7 +9,7 @@ export default function Component({ service }) {
 
   const { widget } = service;
 
-  const { data: minifluxData, error: minifluxError } = useWidgetAPI(widget);
+  const { data: minifluxData, error: minifluxError } = useWidgetAPI(widget, "counters");
 
   if (minifluxError) {
     return <Container error={minifluxError} />;
diff --git a/src/widgets/miniflux/proxy.js b/src/widgets/miniflux/proxy.js
deleted file mode 100644
index 9e6ac951..00000000
--- a/src/widgets/miniflux/proxy.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
-import getServiceWidget from "utils/config/service-helpers";
-import createLogger from "utils/logger";
-
-const logger = createLogger("minifluxProxyHandler");
-
-export default async function minifluxProxyHandler(req, res) {
-  const { group, service } = req.query;
-
-  if (!group || !service) {
-    logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
-    return res.status(400).json({ error: "Invalid proxy service type" });
-  }
-
-  const widget = await getServiceWidget(group, service);
-  if (!widget) {
-    logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
-    return res.status(400).json({ error: "Invalid proxy service type" });
-  }
-
-  const url = new URL(formatApiCall("{url}/v1/feeds/counters", { ...widget }));
-  url.username = widget.username;
-  url.password = widget.password;
-
-  const params = {
-    method: "GET",
-    headers: {
-      "X-Auth-Token": widget.token
-    }
-  };
-
-  // eslint-disable-next-line no-unused-vars
-  const [status, contentType, data] = await httpProxy(url, params);
-
-  let read = 0;
-  let unread = 0;
-  if (status === 200) {
-    const parsed = JSON.parse(data.toString());
-    read = Object.values(parsed.reads).reduce((acc, i) => acc + i, 0);
-    unread = Object.values(parsed.unreads).reduce((acc, i) => acc + i, 0);
-  }
-
-  return res.status(status).send({ read, unread });
-}
diff --git a/src/widgets/miniflux/widget.js b/src/widgets/miniflux/widget.js
index d98fee40..d4efbe2f 100644
--- a/src/widgets/miniflux/widget.js
+++ b/src/widgets/miniflux/widget.js
@@ -1,7 +1,19 @@
-import minifluxProxyHandler from "./proxy";
+import { asJson } from "utils/proxy/api-helpers";
+import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
 
 const widget = {
-  proxyHandler: minifluxProxyHandler,
+  api: "{url}/v1/{endpoint}",
+  proxyHandler: credentialedProxyHandler,
+  
+  mappings: {
+    counters: {
+      endpoint: "feeds/counters",
+      map: (data) => ({
+        read: Object.values(asJson(data).reads).reduce((acc, i) => acc + i, 0),
+        unread: Object.values(asJson(data).unreads).reduce((acc, i) => acc + i, 0)
+      }),
+    },
+  }
 };
 
 export default widget;

From 757ef40afc8cf5a1ff3487a7f9aca0acfabc167a Mon Sep 17 00:00:00 2001
From: Nonoss117 <nonoss117@gmail.com>
Date: Fri, 16 Dec 2022 22:26:11 +0000
Subject: [PATCH 054/347] Translated using Weblate (French)

Currently translated at 100.0% (266 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index c8fcceba..0775729b 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -363,9 +363,9 @@
         "seed": "Seed"
     },
     "tdarr": {
-        "queue": "Queue",
-        "processed": "Processed",
-        "errored": "Errored",
-        "saved": "Saved"
+        "queue": "À traiter",
+        "processed": "Traité",
+        "errored": "En erreur",
+        "saved": "Enregistré"
     }
 }

From 55f9d7705474ab5373775f56d35f9e9aae4a0683 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:40 +0000
Subject: [PATCH 055/347] Translated using Weblate (German)

Currently translated at 85.0% (228 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 61083c81..91181ee4 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "unread": "Unread",
+        "read": "Read"
     }
 }

From 0e4d1da1cc7a2bbba0d2f9d88a2a1ed2764ba16a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:40 +0000
Subject: [PATCH 056/347] Translated using Weblate (Spanish)

Currently translated at 97.7% (262 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index bda73e4c..d724860f 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "saved": "Saved",
         "errored": "Errored"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 45767d4b2796c927e3beed28c3c0ee42fa807726 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:40 +0000
Subject: [PATCH 057/347] Translated using Weblate (French)

Currently translated at 99.2% (266 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 0775729b..5ce9dc33 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -367,5 +367,9 @@
         "processed": "Traité",
         "errored": "En erreur",
         "saved": "Enregistré"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 725c1b7da4f94c6c52e5edd4c34f88eb2427bbb2 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:41 +0000
Subject: [PATCH 058/347] Translated using Weblate (Portuguese)

Currently translated at 61.1% (164 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index faf6bc9a..5df693a6 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -378,5 +378,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From d3a8d272760ba446b9aa6cbea3624670d1918ab4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:41 +0000
Subject: [PATCH 059/347] Translated using Weblate (Russian)

Currently translated at 17.9% (48 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index c9bf359a..894bbdf4 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 413b7a7203f04a1d8c8491c582283b29f1541475 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:41 +0000
Subject: [PATCH 060/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 62.6% (168 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index 621544e2..bf4d502c 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -367,5 +367,9 @@
         "queue": "Queue",
         "processed": "Processed",
         "errored": "Errored"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 705258d30d7399f8edd7a56c00cb929c037868a7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:41 +0000
Subject: [PATCH 061/347] Translated using Weblate (Italian)

Currently translated at 85.4% (229 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 5c313f94..92a9bac6 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "unread": "Unread",
+        "read": "Read"
     }
 }

From f419b3753a0f55ab3cfd83242ab8d9295aa88b62 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:40 +0000
Subject: [PATCH 062/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 29.4% (79 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index c0177996..d34b3d81 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From d5d0313b214e9d9a6ac3bedd52c23cd967636cb5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:41 +0000
Subject: [PATCH 063/347] Translated using Weblate (Vietnamese)

Currently translated at 16.4% (44 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index 8ccc733a..d009b909 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 76db303368a4dffc7bd826e84cd61198a8337593 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:41 +0000
Subject: [PATCH 064/347] Translated using Weblate (Dutch)

Currently translated at 23.5% (63 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 882b6fa1..1dbe3a54 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 15b08cdd4495d49e6fa02a7ac03649413c892143 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:42 +0000
Subject: [PATCH 065/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.3% (9 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 2ea85055..606f7f80 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From fb9c67313020d38d84b28c1586192dbf78753907 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:38 +0000
Subject: [PATCH 066/347] Translated using Weblate (Catalan)

Currently translated at 97.7% (262 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 21535214..23465579 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 4621724fc65278c89438e2daa7093c59ef824e7a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:39 +0000
Subject: [PATCH 067/347] Translated using Weblate (Polish)

Currently translated at 96.2% (258 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index f19b7eb2..44a639b4 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From b7a45512cffc9d64a497d246eb47664ce104fed3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:37 +0000
Subject: [PATCH 068/347] Translated using Weblate (Swedish)

Currently translated at 48.5% (130 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index d0ef742d..0844d637 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From e44972ec442a4dd2df35dde5c1f79f9540118c16 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:37 +0000
Subject: [PATCH 069/347] Translated using Weblate (Croatian)

Currently translated at 95.5% (256 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index f64de9bc..11980d15 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 7ef294291a6aae039ba91c39257a228683c19458 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:38 +0000
Subject: [PATCH 070/347] Translated using Weblate (Hungarian)

Currently translated at 40.2% (108 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 8bd676c0..38e7cd18 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From de9ca09e704d1db2a2c17c73c4f1b249d72d3244 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:37 +0000
Subject: [PATCH 071/347] Translated using Weblate (Hebrew)

Currently translated at 37.6% (101 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 6fd7d10d..6a4f56e6 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 931947bffc13d2e110ee955601971cdeaf79b826 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:38 +0000
Subject: [PATCH 072/347] Translated using Weblate (Romanian)

Currently translated at 51.1% (137 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 825b8fa5..a4ec2697 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 67ed9b294ba6a672436a364b549d3ff2850b6396 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:38 +0000
Subject: [PATCH 073/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 43.6% (117 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index b5205c1e..9d2f2d70 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From b7d9124228e0eab7ae4663c4eb32290accabf98a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:37 +0000
Subject: [PATCH 074/347] Translated using Weblate (Yue)

Currently translated at 44.0% (118 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index ae4dd999..04ea9889 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 3e177ec39dc9e64e514aca4b881a17567fe1eb4a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:39 +0000
Subject: [PATCH 075/347] Translated using Weblate (Finnish)

Currently translated at 45.8% (123 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 956586cf..acba0bdd 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From c3e14a0593c3d7f20512821aafad2dfd3de289ec Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:39 +0000
Subject: [PATCH 076/347] Translated using Weblate (Telugu)

Currently translated at 80.9% (217 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index da396145..c5dcd1de 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 158bb0ae41ca215d44e7a5171eee814eac0ddfe8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:39 +0000
Subject: [PATCH 077/347] Translated using Weblate (Bulgarian)

Currently translated at 17.1% (46 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index e267a357..0c6e6a33 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -367,5 +367,9 @@
         "queue": "Queue",
         "processed": "Processed",
         "errored": "Errored"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 64a6af7bf647932668e029f078588b40ababb7f5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:38 +0000
Subject: [PATCH 078/347] Translated using Weblate (Turkish)

Currently translated at 86.1% (231 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 53d34c64..b5b8cd9c 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 04f2d2a0e4d13be0cd01e355d7d1ead9eb4e9a23 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:39 +0000
Subject: [PATCH 079/347] Translated using Weblate (Serbian)

Currently translated at 3.3% (9 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 4b7fbc9f..716215bb 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 18765f7b4d1dc523a809f97986d3168eadd323d7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:38 +0000
Subject: [PATCH 080/347] Translated using Weblate (Arabic)

Currently translated at 16.4% (44 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index c6aa6493..2fe9e957 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From d1336c5b955b7c1058b0e72d852b1ae87fe890e4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:40 +0000
Subject: [PATCH 081/347] Translated using Weblate (Czech)

Currently translated at 83.9% (225 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index d1b573f6..7b7a6eb6 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 751167fb17534b49c7c3e097acdbb9987387c3b2 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:40 +0000
Subject: [PATCH 082/347] Translated using Weblate (Danish)

Currently translated at 73.8% (198 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index b172c8c5..05e68223 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 23b59dc542516ee0f621a052ac60686fd4b50c1e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:42 +0000
Subject: [PATCH 083/347] Translated using Weblate (Malay)

Currently translated at 94.4% (253 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index a081183d..198eb9fd 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From a88a803d38f0034161cd944499cdb9a7f1b6fdf9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:38 +0000
Subject: [PATCH 084/347] Translated using Weblate (Hindi)

Currently translated at 3.3% (9 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 4bb57aeb..51167ab9 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From d79bf7ef80cde8159d8e59d70a25f431bd61baa5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:41:39 +0000
Subject: [PATCH 085/347] Translated using Weblate (Esperanto)

Currently translated at 38.4% (103 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index ea57cd80..86f4ca0d 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -367,5 +367,9 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
     }
 }

From 4fcc8f004d73b59c21bde9f4c730d8980d1ca41f Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:35 +0000
Subject: [PATCH 086/347] Translated using Weblate (German)

Currently translated at 84.4% (228 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 91181ee4..01ad64bf 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "unread": "Unread",
         "read": "Read"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 5bd1dd71f665dfa34e497146896659b899aa5dfd Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:35 +0000
Subject: [PATCH 087/347] Translated using Weblate (Spanish)

Currently translated at 97.0% (262 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index d724860f..f7dc8061 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 6d1c9263b7b913ef13f993b0123ce3e5433776fd Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:35 +0000
Subject: [PATCH 088/347] Translated using Weblate (French)

Currently translated at 98.5% (266 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 5ce9dc33..2a348659 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 60fcbbfeafddf4fa12bffc107a15df4d2a2bea22 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:36 +0000
Subject: [PATCH 089/347] Translated using Weblate (Portuguese)

Currently translated at 60.7% (164 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 5df693a6..7ae8bbf0 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -382,5 +382,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 09d7b8f5ed2f24eb8b8d31e5b26a482c688f042c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:36 +0000
Subject: [PATCH 090/347] Translated using Weblate (Russian)

Currently translated at 17.7% (48 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 894bbdf4..a46ba905 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From ec3faa31a5f5ac536e0005bdce26176025ba76d3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:36 +0000
Subject: [PATCH 091/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 62.2% (168 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index bf4d502c..e3431050 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 8bb716e1c5eb4671ecb138ce7891dac334a1213c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:36 +0000
Subject: [PATCH 092/347] Translated using Weblate (Italian)

Currently translated at 84.8% (229 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 92a9bac6..4834ff0f 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "unread": "Unread",
         "read": "Read"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 95794dc837dd669b1d0d51c0fe933c816c9c3970 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:35 +0000
Subject: [PATCH 093/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 29.2% (79 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index d34b3d81..f42165ab 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 988f3dfdd5248221644aa0f3bce471e4e166f3d9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:36 +0000
Subject: [PATCH 094/347] Translated using Weblate (Vietnamese)

Currently translated at 16.2% (44 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index d009b909..fff8da35 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From d1971986eacf87752e3c14805ddfc1711c133089 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:36 +0000
Subject: [PATCH 095/347] Translated using Weblate (Dutch)

Currently translated at 23.3% (63 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 1dbe3a54..bd3a15f1 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 5263a66fbecb890764512c4b1e0be44683abb11f Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:37 +0000
Subject: [PATCH 096/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.3% (9 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 606f7f80..0d855836 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 112cbaf813d9ef33137e134f485b634dfa790cca Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:32 +0000
Subject: [PATCH 097/347] Translated using Weblate (Catalan)

Currently translated at 97.0% (262 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 23465579..aac837b8 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 1feaae72911f865811a07711857aabad5192f331 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:34 +0000
Subject: [PATCH 098/347] Translated using Weblate (Polish)

Currently translated at 95.5% (258 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index 44a639b4..8c09cb30 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From f7a666e8c5565201a3db016cc19e0d8d1a585cfa Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:32 +0000
Subject: [PATCH 099/347] Translated using Weblate (Swedish)

Currently translated at 48.1% (130 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 0844d637..b6700587 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From f3e52f0bdf9879d4d0ad7d40c0cc0c10e559d8ef Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:32 +0000
Subject: [PATCH 100/347] Translated using Weblate (Croatian)

Currently translated at 94.8% (256 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 11980d15..1939ddda 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From a14dfb93601d15873b45fee135fb4d582e5af688 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:33 +0000
Subject: [PATCH 101/347] Translated using Weblate (Hungarian)

Currently translated at 40.0% (108 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 38e7cd18..4162426b 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From ccda10fca480b2034cda81948042c25744526eed Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:32 +0000
Subject: [PATCH 102/347] Translated using Weblate (Hebrew)

Currently translated at 37.4% (101 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 6a4f56e6..c3844f59 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 3446c9b2a1eb12caff22cd30d0ba326d965e2be2 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:33 +0000
Subject: [PATCH 103/347] Translated using Weblate (Romanian)

Currently translated at 50.7% (137 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index a4ec2697..1d5ad268 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 4e23a931cd7ba91944020195f1f34d1c8fa51d18 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:33 +0000
Subject: [PATCH 104/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 43.3% (117 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 9d2f2d70..dcdebd97 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 65454014ef5ba01d9aef4c843c19be870345e8a3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:32 +0000
Subject: [PATCH 105/347] Translated using Weblate (Yue)

Currently translated at 43.7% (118 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 04ea9889..6d687c73 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 85d9b2fc8a42c350e821618b9406fe10c3b18a8a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:34 +0000
Subject: [PATCH 106/347] Translated using Weblate (Finnish)

Currently translated at 45.5% (123 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index acba0bdd..540f1d0d 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 216a67fc127f479387977d81a656e2606489c3d3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:34 +0000
Subject: [PATCH 107/347] Translated using Weblate (Telugu)

Currently translated at 80.3% (217 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index c5dcd1de..529e2669 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From b1aa093f5db30085f5de05828412ad481fe7c2d5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:34 +0000
Subject: [PATCH 108/347] Translated using Weblate (Bulgarian)

Currently translated at 17.0% (46 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 0c6e6a33..61fdbf50 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 8a2a624956f66742634eb50bf247d978ae80cdb4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:33 +0000
Subject: [PATCH 109/347] Translated using Weblate (Turkish)

Currently translated at 85.5% (231 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index b5b8cd9c..5c72fbe4 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 2e8ea3b0d884dc23d8e9a4a5af82ee027f889f31 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:34 +0000
Subject: [PATCH 110/347] Translated using Weblate (Serbian)

Currently translated at 3.3% (9 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 716215bb..05db820c 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 2df5e8d7918bc45fb8cfd4417bdda4bab12584ba Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:33 +0000
Subject: [PATCH 111/347] Translated using Weblate (Arabic)

Currently translated at 16.2% (44 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index 2fe9e957..885002a0 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From c985c4788bee01b1d459cb2a1587a553b9e38fa9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:35 +0000
Subject: [PATCH 112/347] Translated using Weblate (Czech)

Currently translated at 83.3% (225 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 7b7a6eb6..5a2310d8 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From f0bca41c5ed401b6fb0a12088dedb5e01c544244 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:35 +0000
Subject: [PATCH 113/347] Translated using Weblate (Danish)

Currently translated at 73.3% (198 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 05e68223..13a777f5 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 5470c68cb4cbc5ee708d4fbe4d7e7fb3fb337504 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:36 +0000
Subject: [PATCH 114/347] Translated using Weblate (Malay)

Currently translated at 93.7% (253 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 198eb9fd..6a52ef0f 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From abf65caba71470e149bb5ab338cf24b221cdf849 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:33 +0000
Subject: [PATCH 115/347] Translated using Weblate (Hindi)

Currently translated at 3.3% (9 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 51167ab9..17b89cc9 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 6fd187c54ca41e6568c6a1027e7018d4e56723a8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:47:33 +0000
Subject: [PATCH 116/347] Translated using Weblate (Esperanto)

Currently translated at 38.1% (103 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index 86f4ca0d..bddba058 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -371,5 +371,9 @@
     "miniflux": {
         "read": "Read",
         "unread": "Unread"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
     }
 }

From 9a81c9a4181830acbc9d3506bba0990789923cee Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:07 +0000
Subject: [PATCH 117/347] Translated using Weblate (German)

Currently translated at 83.8% (228 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 01ad64bf..0cd9ecb0 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 70a77718db3cb0aa9e59084bdda09a039b169f91 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:07 +0000
Subject: [PATCH 118/347] Translated using Weblate (Spanish)

Currently translated at 96.3% (262 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index f7dc8061..2a36b485 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From dab627e2488b7340b55db3bceba3a44f363d8180 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:08 +0000
Subject: [PATCH 119/347] Translated using Weblate (French)

Currently translated at 97.7% (266 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 2a348659..13024c0e 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}",
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}"
     }
 }

From 92b80d1e4675295c3d5a6b2fed326d75f9f786bd Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:08 +0000
Subject: [PATCH 120/347] Translated using Weblate (Portuguese)

Currently translated at 60.2% (164 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 7ae8bbf0..0f49be33 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -104,7 +104,9 @@
         "byterate": "{{value, bytes}}",
         "ms": "{{value, number}}",
         "bitrate": "{{value, bytes(bits: true)}}",
-        "percent": "{{value, percent}}"
+        "percent": "{{value, percent}}",
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     },
     "weather": {
         "current": "Localização atual",

From 0bc65e4345804ffde387b11b05bdefade52fcda5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:08 +0000
Subject: [PATCH 121/347] Translated using Weblate (Russian)

Currently translated at 17.6% (48 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index a46ba905..0355083a 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From ac5dfe5a9c869ccaa3f87e2fc0bebf540df83162 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:08 +0000
Subject: [PATCH 122/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 61.7% (168 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index e3431050..2ab75c3b 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From bb3fd88a908a9e7db5baf6d738590acb4213a653 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:08 +0000
Subject: [PATCH 123/347] Translated using Weblate (Italian)

Currently translated at 84.1% (229 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 4834ff0f..e3381246 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From ee5bb5364bb3713aaed08832b66c92958ff95b10 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:07 +0000
Subject: [PATCH 124/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 29.0% (79 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index f42165ab..070d31e2 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 2e0b55bd37b6e86e9d0890e105f6d51b014395cf Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:08 +0000
Subject: [PATCH 125/347] Translated using Weblate (Vietnamese)

Currently translated at 16.1% (44 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index fff8da35..d33a94c9 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 0b47e083eaec406eb86a760f87b21d4f193101c2 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:08 +0000
Subject: [PATCH 126/347] Translated using Weblate (Dutch)

Currently translated at 23.1% (63 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index bd3a15f1..3e549a8c 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 0de4d00d831414d6b7077b51c463f45876f11f24 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:09 +0000
Subject: [PATCH 127/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.3% (9 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 0d855836..045bef50 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 0b8ce67e1091d345b79fa7c7b215d222a9020780 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:05 +0000
Subject: [PATCH 128/347] Translated using Weblate (Catalan)

Currently translated at 96.3% (262 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index aac837b8..02102cbd 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From de8747c9f53de54ad33b9f8c46cee2ab72046295 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:06 +0000
Subject: [PATCH 129/347] Translated using Weblate (Polish)

Currently translated at 94.8% (258 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index 8c09cb30..d7bed406 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From a2bbcce69ed174efa92b1ee164fbb674357a774f Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:04 +0000
Subject: [PATCH 130/347] Translated using Weblate (Swedish)

Currently translated at 47.7% (130 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index b6700587..6da46d40 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From f1e7df394ea9c1d11460528f6818088d1b322609 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:04 +0000
Subject: [PATCH 131/347] Translated using Weblate (Croatian)

Currently translated at 94.1% (256 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 1939ddda..f507125e 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From bca6340dedb3ceade8440cceb45e8fb1e92f11dd Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:05 +0000
Subject: [PATCH 132/347] Translated using Weblate (Hungarian)

Currently translated at 39.7% (108 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 4162426b..b28a0e4f 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From a1e9afae85b10093deaf9a9729b696329fe5b34e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:04 +0000
Subject: [PATCH 133/347] Translated using Weblate (Hebrew)

Currently translated at 37.1% (101 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index c3844f59..eeeee0a6 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From c224a26bc840f16f4cf9f5d42a539ab2a6720c57 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:05 +0000
Subject: [PATCH 134/347] Translated using Weblate (Romanian)

Currently translated at 50.3% (137 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 1d5ad268..5e28a94f 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 44dbff308aafaf1e3ded4f430810b38a2d0c7d27 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:05 +0000
Subject: [PATCH 135/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 43.0% (117 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index dcdebd97..51147130 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From c2d6b9738f2668f0d1472f43099660fb1e3266b9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:04 +0000
Subject: [PATCH 136/347] Translated using Weblate (Yue)

Currently translated at 43.3% (118 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 6d687c73..09237cc9 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 6b72b60b5e5ad12889a30ade91e561b863237a3b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:06 +0000
Subject: [PATCH 137/347] Translated using Weblate (Finnish)

Currently translated at 45.2% (123 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 540f1d0d..d84bb349 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 27a7adc282a14567464b4a8909e522bab17e3586 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:06 +0000
Subject: [PATCH 138/347] Translated using Weblate (Telugu)

Currently translated at 79.7% (217 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 529e2669..7a283f79 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 55cd4c5ada8de3a60b5888a5b1b5d8b198104499 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:06 +0000
Subject: [PATCH 139/347] Translated using Weblate (Bulgarian)

Currently translated at 16.9% (46 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 61fdbf50..4437e1a7 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 5deb58f0923fe54ecb560a6863931c5b291d544f Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:05 +0000
Subject: [PATCH 140/347] Translated using Weblate (Turkish)

Currently translated at 84.9% (231 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 5c72fbe4..45042d77 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From f58ae97c6ea593d6ac664ddeb660027c813c6292 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:06 +0000
Subject: [PATCH 141/347] Translated using Weblate (Serbian)

Currently translated at 3.3% (9 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 05db820c..67c4ecc2 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 6b634b4ef5ff9bd5253c927d23a269e4f15d63c9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:05 +0000
Subject: [PATCH 142/347] Translated using Weblate (Arabic)

Currently translated at 16.1% (44 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index 885002a0..659a87d6 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 483c5cf87a65b045fd98d971b2dec5c000f118d2 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:07 +0000
Subject: [PATCH 143/347] Translated using Weblate (Czech)

Currently translated at 82.7% (225 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 5a2310d8..d0e4a87d 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From f81d7540448511543378acc7677a48b1b28a9f78 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:07 +0000
Subject: [PATCH 144/347] Translated using Weblate (Danish)

Currently translated at 72.7% (198 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 13a777f5..3746f93a 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 5b515822d325c19e682a2cdcf65cf32433271a1b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:09 +0000
Subject: [PATCH 145/347] Translated using Weblate (Malay)

Currently translated at 93.0% (253 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 6a52ef0f..34fd1da5 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From 6dc6ee54ea759c3c122a495b1d0a2bb7a1d5f66b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:06 +0000
Subject: [PATCH 146/347] Translated using Weblate (Hindi)

Currently translated at 3.3% (9 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 17b89cc9..a4c33ac6 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From d16fd0cd05c1271c106c6cdb936164e40ecfd209 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sat, 17 Dec 2022 06:59:06 +0000
Subject: [PATCH 147/347] Translated using Weblate (Esperanto)

Currently translated at 37.8% (103 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index bddba058..9633f29a 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -375,5 +375,9 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     }
 }

From e606b50cd02d8f4a779a0e303a20e1598185ee65 Mon Sep 17 00:00:00 2001
From: Nonoss117 <nonoss117@gmail.com>
Date: Sat, 17 Dec 2022 07:52:21 +0000
Subject: [PATCH 148/347] Translated using Weblate (French)

Currently translated at 100.0% (272 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 13024c0e..90fb83b1 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -369,12 +369,12 @@
         "saved": "Enregistré"
     },
     "miniflux": {
-        "read": "Read",
-        "unread": "Unread"
+        "read": "Lu",
+        "unread": "Non lu"
     },
     "nextdns": {
-        "wait": "Please Wait",
-        "no_devices": "No Device Data Received"
+        "wait": "Patientez...",
+        "no_devices": "Aucune donnée d'appareil reçue"
     },
     "common": {
         "bibitrate": "{{value, rate(bits: true; binary: true)}}",

From 8e40aa18698dd2f34a0325749e2e60d8d32360b4 Mon Sep 17 00:00:00 2001
From: gallegonovato <fran-carro@hotmail.es>
Date: Sun, 18 Dec 2022 17:27:29 +0000
Subject: [PATCH 149/347] Translated using Weblate (Spanish)

Currently translated at 100.0% (272 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 2a36b485..37926546 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -363,18 +363,18 @@
         "seed": "Seed"
     },
     "tdarr": {
-        "queue": "Queue",
-        "processed": "Processed",
-        "saved": "Saved",
-        "errored": "Errored"
+        "queue": "Cola",
+        "processed": "Procesado",
+        "saved": "Guardado",
+        "errored": "Error"
     },
     "miniflux": {
-        "read": "Read",
-        "unread": "Unread"
+        "read": "Leer",
+        "unread": "Sin leer"
     },
     "nextdns": {
-        "wait": "Please Wait",
-        "no_devices": "No Device Data Received"
+        "wait": "Espere, por favor",
+        "no_devices": "No se reciben datos del dispositivo"
     },
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",

From 92641695adbe336736621d93db0e9ad10d0d3ed0 Mon Sep 17 00:00:00 2001
From: Brian Choy <bycEEE@gmail.com>
Date: Wed, 21 Dec 2022 12:14:28 +0000
Subject: [PATCH 150/347] Fix minor typo

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 6409c2d2..c97c65f9 100644
--- a/README.md
+++ b/README.md
@@ -117,7 +117,7 @@ pnpm start
 
 ## Configuration
 
-Configuration files will be genereted and placed on the first request.
+Configuration files will be generated and placed on the first request.
 
 Configuration is done in the /config directory using .yaml files. Refer to each config for
 the specific configuration options.

From a9cc0100f6f337d459546dd37ca8cb3bed0f9d91 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 21 Dec 2022 12:08:34 -0800
Subject: [PATCH 151/347] Squashed commit of the following from initial Omada
 widget:

commit ad3e664b56ad2a9024684f2141f8f21ead59177e
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 13 19:54:54 2022 +0100

    Add .idea to .gitignore

commit 7e51a093845c6bcda4fac78a2c174adbcc7701b6
Merge: 93d8035 7dd0b0e
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Tue Dec 13 18:38:51 2022 +0100

    Merge branch 'benphelps:main' into main

commit 93d80350b1d4519ac217b880568ccabbef43f03f
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 13 18:15:20 2022 +0100

    Omada widget : One widget, shows only the number alerts, the number of connected AP, the number of connected devices to Wifi, the number of connected switches and gatewawys.

commit a1babd860ce8a2dd6981b7fef6e055e249cbccb2
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 13 09:33:50 2022 +0100

    Omada widget : spliting widget between WLAN and LAN/WAN fields to have no more than 5 fields per widget.

commit e12cc65c7703f2f1930fc7646c1f4386b49e73fb
Merge: 331f31f 146326f
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Sun Dec 11 14:39:27 2022 +0100

    Merge branch 'benphelps:main' into main

commit 331f31fc2be80e0738869fd050b3034638979350
Merge: 37154e3 ccc1229
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Sat Dec 10 17:56:44 2022 +0100

    Merge branch 'benphelps:main' into main

commit 37154e327af7d3fe66e7638ba79851ef789d3649
Author: Benoit <oupsman@oupsman.fr>
Date:   Sat Dec 10 17:11:30 2022 +0100

    Omada widget : Improved error handling
    Omada widget: handling power as common.power in translation

commit 1f484914067e514f22c1f250b62f589fedefe1fd
Author: Benoit <oupsman@oupsman.fr>
Date:   Sat Dec 10 10:24:55 2022 +0100

    Omada widget : adding stats for isolated aps, connected gateways, connected switches, available ports, power consumption

commit f375f0b815bf6697f7044995203084427b14ea69
Merge: 467b678 775b511
Author: Benoit <oupsman@oupsman.fr>
Date:   Fri Dec 9 21:06:38 2022 +0100

    Merge branch 'main' of https://github.com/Oupsman/homepage into main

commit 467b67802a7b8dface01703b6035951dcaa1e069
Author: Benoit <oupsman@oupsman.fr>
Date:   Fri Dec 9 21:06:09 2022 +0100

    Omada widget : v3 v4 and v5 versions don't use the same fields for the same stats, I've corrected the code to make it more reliable

commit 775b5111e13072a18edb33f30a4d4f0589bc2af0
Merge: 8d66756 88c4375
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Thu Dec 8 15:38:20 2022 +0100

    Merge branch 'benphelps:main' into main

commit 8d66756a7d8f9e0b43c8abde2f2e6f2fd86a1098
Author: Benoit <oupsman@oupsman.fr>
Date:   Thu Dec 8 12:45:44 2022 +0100

    Omada Widget : code cleanup

commit 282a6d0592c53a39184d63bba517f482a84f5b36
Author: Benoit <oupsman@oupsman.fr>
Date:   Thu Dec 8 12:42:41 2022 +0100

    Omada Widget : code cleanup

commit c3e9b8f87075e834ea1a520fd8c93708afb15ac0
Author: Benoit <oupsman@oupsman.fr>
Date:   Thu Dec 8 12:37:10 2022 +0100

    Omada Widget : No more legacy variable, the code detects the controller version and adapts the requests. Logic is not duplicated anymore

commit eafcc205975cc1bd04f063f1627d380f2a2b7f04
Author: Benoit <oupsman@oupsman.fr>
Date:   Wed Dec 7 15:46:00 2022 +0100

    V2 API is working

commit bcc2864ee2e1f0f1d2f4c009df1ba8a1a7244f80
Author: Benoit <oupsman@oupsman.fr>
Date:   Wed Dec 7 10:01:26 2022 +0100

    Code fore v2 API is not working but V1 code is.

commit ea8e297e849c2ef5659bfec94d76d2fff8677c4c
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 6 14:28:05 2022 +0100

    Errors handling

commit ab6d51a88c8737654dd31bec46106d7c49ed39d2
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 6 09:50:14 2022 +0100

    Adding alerts

commit 047db2cce867c0207be7fe0827b24107fdd84923
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:53:43 2022 +0100

    Fixed translation system

commit 42c5a3e6658f22662b1c58f54cba31dc90bfbc61
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:34:34 2022 +0100

    Translation system is still * up

commit c80eac9d5bd5491ec4a61da38cdaf82f0ea1cc2f
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:33:50 2022 +0100

    Translation system is still * up

commit f8ba6b02454d66eb96e7e6ebd8022492ff79e690
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:32:22 2022 +0100

    Translation system is still * up

commit dec7eec6de26298eb7c90fd01e1c0fd23b6469a4
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:16:13 2022 +0100

    Translation system is * up

commit cc840cf7ccb40509f1da3f521a4a1b3e26498ac0
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 21:33:00 2022 +0100

    First working version

commit 54b65e619e41c9963a614a177df3a4af68ebe77d
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 18:59:09 2022 +0100

    Using getGlobalStat method

commit 7ebc8500da9d52bd2911a620179fb6585f044c47
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 14:33:37 2022 +0100

    Working on Omada Widget : NOT WORKING FOR NOW

commit 04eaf28cae1be0935cb190e50ae5b75c19254403
Merge: 61065ac 826fe15
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 10:32:30 2022 +0100

    Merge branch 'main' of https://github.com/Oupsman/homepage into main

commit 61065ace2887c3c1d6486001d34ce6f58d58958d
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 10:24:57 2022 +0100

    Working on Omada Widget

remove idea

Co-Authored-By: Benoit SERRA <11260343+oupsman@users.noreply.github.com>
---
 public/locales/en/common.json   |  10 ++
 src/widgets/components.js       |   1 +
 src/widgets/omada/component.jsx |  41 +++++
 src/widgets/omada/proxy.js      | 272 ++++++++++++++++++++++++++++++++
 src/widgets/omada/widget.js     |  15 ++
 src/widgets/widgets.js          |   2 +
 6 files changed, 341 insertions(+)
 create mode 100644 src/widgets/omada/component.jsx
 create mode 100644 src/widgets/omada/proxy.js
 create mode 100644 src/widgets/omada/widget.js

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index d8bfb039..78c5dce8 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -88,6 +88,16 @@
         "bitrate": "Bitrate",
         "no_active": "No Active Streams"
     },
+    "omada": {
+      "activeUser": "Active devices",
+      "alerts": "Alerts",
+      "connectedAp": "Connected APs",
+      "isolatedAp": "Isolated APs",
+      "powerConsumption": "Power consumption",
+      "availablePorts"  : "Available ports",
+      "connectedGateway": "Connected gateways",
+      "connectedSwitches": "Connected switches"
+    },
     "nzbget": {
         "rate": "Rate",
         "remaining": "Remaining",
diff --git a/src/widgets/components.js b/src/widgets/components.js
index eb7c686f..9f3011b3 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -26,6 +26,7 @@ const components = {
   nextdns: dynamic(() => import("./nextdns/component")),
   npm: dynamic(() => import("./npm/component")),
   nzbget: dynamic(() => import("./nzbget/component")),
+  omada: dynamic(() => import("./omada/component")),
   ombi: dynamic(() => import("./ombi/component")),
   overseerr: dynamic(() => import("./overseerr/component")),
   paperlessngx: dynamic(() => import("./paperlessngx/component")),
diff --git a/src/widgets/omada/component.jsx b/src/widgets/omada/component.jsx
new file mode 100644
index 00000000..d499da36
--- /dev/null
+++ b/src/widgets/omada/component.jsx
@@ -0,0 +1,41 @@
+import { useTranslation } from "next-i18next";
+
+import useWidgetAPI from "../../utils/proxy/use-widget-api";
+import Container from "../../components/services/widget/container";
+import Block from "../../components/services/widget/block";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: omadaData, error: omadaAPIError } = useWidgetAPI(widget, "stats", {
+    refreshInterval: 5000,
+  });
+
+  if (omadaAPIError) {
+    return <Container error={omadaAPIError} />;
+  }
+
+  if (!omadaData) {
+    return (
+      <Container service={service}>
+        <Block label="omada.connectedAp" />
+        <Block label="omada.activeUser" />
+        <Block label="omada.alerts" />
+        <Block label="omada.connectedGateway" />
+        <Block label="omada.connectedSwitches" />
+      </Container>
+    );
+  }
+
+  return (
+    <Container service={service}>
+      <Block label="omada.connectedAp" value={t( "common.number", { value: omadaData.connectedAp})} />
+      <Block label="omada.activeUser" value={t( "common.number", { value: omadaData.activeUser })} />
+      <Block label="omada.alerts" value={t( "common.number", { value: omadaData.alerts })} />
+      { omadaData.connectedGateways > 0 && <Block label="omada.connectedGateway" value={t("common.number", { value: omadaData.connectedGateways})} /> }
+      { omadaData.connectedSwitches > 0 && <Block label="omada.connectedSwitches" value={t("common.number", { value: omadaData.connectedSwitches})} /> }
+    </Container>
+  );
+}
diff --git a/src/widgets/omada/proxy.js b/src/widgets/omada/proxy.js
new file mode 100644
index 00000000..58263052
--- /dev/null
+++ b/src/widgets/omada/proxy.js
@@ -0,0 +1,272 @@
+
+import { httpProxy } from "utils/proxy/http";
+import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
+import widgets from "widgets/widgets";
+
+const proxyName = "omadaProxyHandler";
+
+const logger = createLogger(proxyName);
+
+
+async function login(loginUrl, username, password, cversion) {
+  let params;
+  if (cversion < "4.0.0") {
+    // change the parameters of the query string
+    params = JSON.stringify({
+      "method": "login",
+      "params": {
+        "name": username,
+        "password": password
+      }
+    });
+  } else {
+    params = JSON.stringify({
+        "username": username,
+        "password": password
+    });
+  }
+  const authResponse = await httpProxy(loginUrl, {
+      method: "POST",
+      body: params,
+        headers: {
+          "Content-Type": "application/json",
+        },
+      });
+
+  const data = JSON.parse(authResponse[2]);
+  const status = authResponse[0];
+  let token;
+  if (data.errorCode === 0) {
+    token = data.result.token;
+  } else {
+    token = null;
+  }
+  return [status, token ?? data];
+}
+
+
+export default async function omadaProxyHandler(req, res) {
+  const { group, service } = req.query;
+
+  if (group && service) {
+    const widget = await getServiceWidget(group, service);
+
+    if (!widgets?.[widget.type]?.api) {
+      return res.status(403).json({ error: "Service does not support API calls" });
+    }
+
+    if (widget) {
+      let cid;
+      let cversion;
+      let connectedAp;
+      let activeuser;
+      let connectedSwitches;
+      let connectedGateways;
+
+      let alerts;
+      let loginUrl;
+      let siteName;
+      let requestresponse;
+
+      const {url} = widget;
+
+      const controllerInfoUrl = `${widget.url}/api/info`;
+
+      const cInfoResponse = await httpProxy(controllerInfoUrl, {
+          method: "GET",
+          headers: {
+            "Content-Type": "application/json",
+          },
+      });
+
+
+      if (cInfoResponse[0] === 500) {
+        logger.debug("Getting controller version ends with Error 500");
+        return res.status(cInfoResponse[0]).json({error: {message: "HTTP Error", controllerInfoUrl, data: cInfoResponse[2]}});
+
+      }
+      const cidresult = cInfoResponse[2];
+
+      try {
+        cid = JSON.parse(cidresult).result.omadacId;
+        cversion = JSON.parse(cidresult).result.controllerVer;
+      } catch (e) {
+        cversion = "3.2.17"
+      }
+      if (cversion < "4.0.0") {
+        loginUrl = `${widget.url}/api/user/login?ajax`;
+      } else if (cversion < "5.0.0") {
+        loginUrl = `${widget.url}/api/v2/login`;
+      } else {
+        loginUrl = `${widget.url}/${cid}/api/v2/login`;
+      }
+      requestresponse = await login(loginUrl, widget.username, widget.password, cversion);
+
+      if (requestresponse[1].errorCode) {
+        return res.status(requestresponse[0]).json({error: {message: "Error logging in", url, data: requestresponse[1]}});
+      }
+
+     const token = requestresponse[1];
+      // Switching to the site we want to gather stats from
+      // First, we get the list of sites
+      let sitesUrl;
+      let body;
+      let params;
+      let headers;
+      let method;
+      let sitetoswitch;
+      if (cversion < "4.0.0") {
+        sitesUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
+        body = JSON.stringify({
+          "method": "getUserSites",
+          "params": {
+            "userName": widget.username
+          }});
+        params = { "token": token };
+        headers = { };
+        method = "POST";
+      } else if (cversion < "5.0.0") {
+        sitesUrl = `${widget.url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
+        body = {};
+        params = {"token": token};
+        headers = {"Csrf-Token": token };
+        method = "GET";
+
+      } else {
+        sitesUrl = `${widget.url}/${cid}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
+        body = {};
+        headers = { "Csrf-Token": token };
+        method = "GET";
+        params = { };
+      }
+      requestresponse = await httpProxy(sitesUrl, {
+        method,
+        params,
+        body: body.toString(),
+        headers,
+      });
+      const listresult = JSON.parse(requestresponse[2]);
+      if (listresult.errorCode !== 0) {
+        logger.debug(`HTTTP ${requestresponse[0]} getting sites list: ${requestresponse[2].msg}`);
+        return res.status(requestresponse[0]).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
+      }
+
+      // Switching site is really needed only for Omada 3.x.x controllers
+
+      let switchUrl;
+
+      if (cversion < "4.0.0") {
+        sitetoswitch = listresult.result.siteList.filter(site => site.name === widget.site);
+        siteName = sitetoswitch[0].siteName;
+        switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
+        method = "POST";
+        body = JSON.stringify({
+          "method": "switchSite",
+          "params": {
+            "siteName": siteName,
+            "userName": widget.username
+          }
+        });
+        headers = { "Content-Type": "application/json" };
+        params = { "token": token };
+        requestresponse = await httpProxy(switchUrl, {
+          method,
+          params,
+          body: body.toString(),
+          headers,
+        });
+        const switchresult = JSON.parse(requestresponse[2]);
+        if (switchresult.errorCode !== 0) {
+          logger.debug(`HTTTP ${requestresponse[0]} getting sites list: ${requestresponse[2]}`);
+          return res.status(requestresponse[0]).json({error: {message: "Error switching site", url, data: requestresponse[2]}});
+        }
+      }
+
+      // OK now we are on the correct site. Let's get the stats
+      // on modern controller, we need to call two different endpoints
+      // on older controller, we can call one endpoint
+      if (cversion < "4.0.0") {
+        const statsUrl = `${widget.url}/web/v1/controller?getGlobalStat=&token=${token}`;
+        const statResponse = await httpProxy(statsUrl, {
+          method: "POST",
+          params: { "token": token },
+          body: JSON.stringify({
+            "method": "getGlobalStat",
+          }),
+          headers: {
+            "Content-Type": "application/json",
+          },
+        });
+
+        const data = JSON.parse(statResponse[2]);
+
+        if (data.errorCode !== 0) {
+          return res.status(statResponse[0]).json({error: {message: "Error getting stats", url, data: statResponse[2]}});
+        }
+        connectedAp = data.result.connectedAp;
+        activeuser = data.result.activeUser;
+        alerts = data.result.alerts;
+
+      } else {
+        let siteStatsUrl;
+        let response;
+        sitetoswitch = listresult.result.data.filter(site => site.name === widget.site);
+
+        if (sitetoswitch.length === 0) {
+          return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data: requestresponse[2]}});
+        }
+
+        // On 5.0.0, the field we need is id, on 4.x.x, it's key ...
+        siteName = sitetoswitch[0].id ?? sitetoswitch[0].key;
+        if (cversion < "5.0.0") {
+          siteStatsUrl = `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000`;
+        } else {
+          siteStatsUrl = `${url}/${cid}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000`;
+        }
+        response = await httpProxy(siteStatsUrl, {
+          method: "GET",
+          headers: {
+            "Csrf-Token": token,
+          },
+        });
+
+        const clientresult = JSON.parse(response[2]);
+        if (clientresult.errorCode !== 0) {
+          logger.debug(`HTTTP ${listresult.errorCode} getting clients stats for site ${widget.site} with message ${listresult.msg}`);
+          return res.status(500).send(response[2]);
+        }
+
+        activeuser = clientresult.result.totalClientNum;
+        connectedAp = clientresult.result.connectedApNum;
+        connectedGateways = clientresult.result.connectedGatewayNum;
+        connectedSwitches = clientresult.result.connectedSwitchNum;
+
+
+        let alertUrl;
+        if (cversion >= "5.0.0") {
+          alertUrl = `${url}/${cid}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000`;
+        } else {
+          alertUrl = `${url}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000`;
+        }
+        response = await httpProxy(alertUrl, {
+          method: "GET",
+          headers: {
+            "Csrf-Token": token,
+          },
+        });
+        const alertresult = JSON.parse(response[2]);
+        alerts = alertresult.result.alertNum;
+      }
+
+      return res.send(JSON.stringify({
+        "connectedAp": connectedAp,
+        "activeUser": activeuser,
+        "alerts": alerts,
+        "connectedGateways": connectedGateways,
+        "connectedSwitches": connectedSwitches,
+      }));
+    }
+  }
+  return res.status(400).json({ error: "Invalid proxy service type" });
+}
diff --git a/src/widgets/omada/widget.js b/src/widgets/omada/widget.js
new file mode 100644
index 00000000..0ef4177e
--- /dev/null
+++ b/src/widgets/omada/widget.js
@@ -0,0 +1,15 @@
+import omadaProxyHandler from "./proxy";
+// import genericProxyHandler from "../../utils/proxy/handlers/generic";
+
+const widget = {
+  api: "{url}/web/v1/{endpoint}",
+  proxyHandler: omadaProxyHandler,
+
+  mappings: {
+    stats: {
+      endpoint: "controller",
+    }
+  }
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 2b45e55a..c68dfe3e 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -21,6 +21,7 @@ import navidrome from "./navidrome/widget";
 import nextdns from "./nextdns/widget";
 import npm from "./npm/widget";
 import nzbget from "./nzbget/widget";
+import omada from "./omada/widget";
 import ombi from "./ombi/widget";
 import overseerr from "./overseerr/widget";
 import paperlessngx from "./paperlessngx/widget";
@@ -73,6 +74,7 @@ const widgets = {
   nextdns,
   npm,
   nzbget,
+  omada,
   ombi,
   overseerr,
   paperlessngx,

From 4a3f836020b8461c4baaa39d5e0fc24d3e08144f Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 21 Dec 2022 12:20:17 -0800
Subject: [PATCH 152/347] Refactor Omada proxy for v4/v5

---
 src/widgets/omada/proxy.js | 291 ++++++++++++++++++-------------------
 1 file changed, 139 insertions(+), 152 deletions(-)

diff --git a/src/widgets/omada/proxy.js b/src/widgets/omada/proxy.js
index 58263052..d5f4d9ba 100644
--- a/src/widgets/omada/proxy.js
+++ b/src/widgets/omada/proxy.js
@@ -9,40 +9,26 @@ const proxyName = "omadaProxyHandler";
 const logger = createLogger(proxyName);
 
 
-async function login(loginUrl, username, password, cversion) {
-  let params;
-  if (cversion < "4.0.0") {
-    // change the parameters of the query string
-    params = JSON.stringify({
-      "method": "login",
-      "params": {
-        "name": username,
-        "password": password
-      }
-    });
-  } else {
-    params = JSON.stringify({
-        "username": username,
-        "password": password
-    });
+async function login(loginUrl, username, password, controllerVersionMajor) {
+  const params = {
+    username: username,
+    password: password
   }
-  const authResponse = await httpProxy(loginUrl, {
-      method: "POST",
-      body: params,
-        headers: {
-          "Content-Type": "application/json",
-        },
-      });
 
-  const data = JSON.parse(authResponse[2]);
-  const status = authResponse[0];
-  let token;
-  if (data.errorCode === 0) {
-    token = data.result.token;
-  } else {
-    token = null;
+  if (controllerVersionMajor < 4) {
+    params.method = "login";
+    params.name = username;
   }
-  return [status, token ?? data];
+  
+  const [status, contentType, data] = await httpProxy(loginUrl, {
+    method: "POST",
+    body: JSON.stringify(params),
+    headers: {
+      "Content-Type": "application/json",
+    },
+  });
+
+  return [status, JSON.parse(data.toString())];
 }
 
 
@@ -57,108 +43,121 @@ export default async function omadaProxyHandler(req, res) {
     }
 
     if (widget) {
-      let cid;
-      let cversion;
-      let connectedAp;
-      let activeuser;
-      let connectedSwitches;
-      let connectedGateways;
-
-      let alerts;
-      let loginUrl;
-      let siteName;
-      let requestresponse;
 
       const {url} = widget;
 
-      const controllerInfoUrl = `${widget.url}/api/info`;
+      const controllerInfoURL = `${widget.url}/api/info`;
 
-      const cInfoResponse = await httpProxy(controllerInfoUrl, {
-          method: "GET",
+      let [status, contentType, data] = await httpProxy(controllerInfoURL, {
           headers: {
             "Content-Type": "application/json",
           },
       });
 
-
-      if (cInfoResponse[0] === 500) {
-        logger.debug("Getting controller version ends with Error 500");
-        return res.status(cInfoResponse[0]).json({error: {message: "HTTP Error", controllerInfoUrl, data: cInfoResponse[2]}});
-
+      if (status !== 200) {
+        logger.error("Unable to retrieve Omada controller info");
+        return res.status(status).json({error: {message: `HTTP Error ${status}`, url: controllerInfoURL, data: data}});
       }
-      const cidresult = cInfoResponse[2];
+
+      const cId = JSON.parse(data).result.omadacId;
+      let controllerVersion;
 
       try {
-        cid = JSON.parse(cidresult).result.omadacId;
-        cversion = JSON.parse(cidresult).result.controllerVer;
+        controllerVersion = JSON.parse(data).result.controllerVer;
       } catch (e) {
-        cversion = "3.2.17"
-      }
-      if (cversion < "4.0.0") {
-        loginUrl = `${widget.url}/api/user/login?ajax`;
-      } else if (cversion < "5.0.0") {
-        loginUrl = `${widget.url}/api/v2/login`;
-      } else {
-        loginUrl = `${widget.url}/${cid}/api/v2/login`;
-      }
-      requestresponse = await login(loginUrl, widget.username, widget.password, cversion);
-
-      if (requestresponse[1].errorCode) {
-        return res.status(requestresponse[0]).json({error: {message: "Error logging in", url, data: requestresponse[1]}});
+        // fallback to this random version?
+        controllerVersion = "3.2.17"
       }
 
-     const token = requestresponse[1];
-      // Switching to the site we want to gather stats from
-      // First, we get the list of sites
+      const controllerVersionMajor = parseInt(controllerVersion.split('.')[0], 10)
+
+      if (![3,4,5].includes(controllerVersionMajor)) {
+        return res.status(500).json({error: {message: "Error determining controller version", data}});
+      }
+
+      let loginUrl;
+
+      switch (controllerVersionMajor) {
+        case 3:
+          loginUrl = `${widget.url}/api/user/login?ajax`;
+          break;
+        case 4:
+          loginUrl = `${widget.url}/api/v2/login`;
+          break;
+        case 5:
+          loginUrl = `${widget.url}/${cId}/api/v2/login`;
+          break;
+        default:
+          break;
+      }
+      
+      const [loginStatus, loginResponseData] = await login(loginUrl, widget.username, widget.password, controllerVersionMajor);
+
+      if (loginStatus !== 200 || loginResponseData.errorCode > 0) {
+        return res.status(requestresponse[0]).json({error: {message: "Error logging in to Oamda controller", url: loginUrl, data: loginResponseData}});
+      }
+
+      const token = loginResponseData.result.token;
+      
+      // List sites
       let sitesUrl;
-      let body;
-      let params;
-      let headers;
-      let method;
-      let sitetoswitch;
-      if (cversion < "4.0.0") {
-        sitesUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
-        body = JSON.stringify({
-          "method": "getUserSites",
-          "params": {
-            "userName": widget.username
-          }});
-        params = { "token": token };
-        headers = { };
-        method = "POST";
-      } else if (cversion < "5.0.0") {
-        sitesUrl = `${widget.url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
-        body = {};
-        params = {"token": token};
-        headers = {"Csrf-Token": token };
-        method = "GET";
+      let body = {};
+      let params = { token };
+      let headers = { "Csrf-Token": token };
+      let method = "GET";
 
-      } else {
-        sitesUrl = `${widget.url}/${cid}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
-        body = {};
-        headers = { "Csrf-Token": token };
-        method = "GET";
-        params = { };
+      switch (controllerVersionMajor) {
+        case 3:
+          sitesUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
+          body = {
+            "method": "getUserSites",
+            "params": {
+              "userName": widget.username
+            }
+          };
+          method = "POST";
+          break;
+        case 4:
+          sitesUrl = `${widget.url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;          
+          break;
+        case 5:
+          sitesUrl = `${widget.url}/${cId}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
+          break;
       }
-      requestresponse = await httpProxy(sitesUrl, {
+      
+      [status, contentType, data] = await httpProxy(sitesUrl, {
         method,
         params,
-        body: body.toString(),
+        body: JSON.stringify(body),
         headers,
       });
-      const listresult = JSON.parse(requestresponse[2]);
-      if (listresult.errorCode !== 0) {
-        logger.debug(`HTTTP ${requestresponse[0]} getting sites list: ${requestresponse[2].msg}`);
-        return res.status(requestresponse[0]).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
+
+      const sitesResponseData = JSON.parse(data);
+
+      let site;
+
+      let connectedAp;
+      let activeUser;
+      let connectedSwitches;
+      let connectedGateways;
+      let alerts;
+
+      if (sitesResponseData.errorCode > 0) {
+        logger.debug(`HTTTP ${status} getting sites list: ${requestresponse[2].msg}`);
+        return res.status(status).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
       }
 
-      // Switching site is really needed only for Omada 3.x.x controllers
+      // on modern controller, we need to call two different endpoints
+      // on older controller, we can call one endpoint
 
-      let switchUrl;
+      if (controllerVersionMajor === 3) {
 
-      if (cversion < "4.0.0") {
-        sitetoswitch = listresult.result.siteList.filter(site => site.name === widget.site);
-        siteName = sitetoswitch[0].siteName;
+        // Switching site is really needed only for Omada 3.x.x controllers
+  
+        let switchUrl;
+  
+        site = listresult.result.siteList.filter(site => site.name === widget.site);
+        siteName = site[0].siteName;
         switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
         method = "POST";
         body = JSON.stringify({
@@ -181,12 +180,7 @@ export default async function omadaProxyHandler(req, res) {
           logger.debug(`HTTTP ${requestresponse[0]} getting sites list: ${requestresponse[2]}`);
           return res.status(requestresponse[0]).json({error: {message: "Error switching site", url, data: requestresponse[2]}});
         }
-      }
-
-      // OK now we are on the correct site. Let's get the stats
-      // on modern controller, we need to call two different endpoints
-      // on older controller, we can call one endpoint
-      if (cversion < "4.0.0") {
+        
         const statsUrl = `${widget.url}/web/v1/controller?getGlobalStat=&token=${token}`;
         const statResponse = await httpProxy(statsUrl, {
           method: "POST",
@@ -205,68 +199,61 @@ export default async function omadaProxyHandler(req, res) {
           return res.status(statResponse[0]).json({error: {message: "Error getting stats", url, data: statResponse[2]}});
         }
         connectedAp = data.result.connectedAp;
-        activeuser = data.result.activeUser;
+        activeUser = data.result.activeUser;
         alerts = data.result.alerts;
 
-      } else {
-        let siteStatsUrl;
-        let response;
-        sitetoswitch = listresult.result.data.filter(site => site.name === widget.site);
+      } else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) {
+        site = sitesResponseData.result.data.find(site => site.name === widget.site);
 
-        if (sitetoswitch.length === 0) {
-          return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data: requestresponse[2]}});
+        if (site.length === 0) {
+          return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data}});
         }
 
-        // On 5.0.0, the field we need is id, on 4.x.x, it's key ...
-        siteName = sitetoswitch[0].id ?? sitetoswitch[0].key;
-        if (cversion < "5.0.0") {
-          siteStatsUrl = `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000`;
-        } else {
-          siteStatsUrl = `${url}/${cid}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000`;
-        }
-        response = await httpProxy(siteStatsUrl, {
-          method: "GET",
+        const siteName = (controllerVersionMajor === 5) ? site.id : site.key;
+        const siteStatsUrl = (controllerVersionMajor === 4) ? 
+          `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000` :
+          `${url}/${cId}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000`;
+
+        [status, contentType, data] = await httpProxy(siteStatsUrl, {
           headers: {
             "Csrf-Token": token,
           },
         });
 
-        const clientresult = JSON.parse(response[2]);
-        if (clientresult.errorCode !== 0) {
-          logger.debug(`HTTTP ${listresult.errorCode} getting clients stats for site ${widget.site} with message ${listresult.msg}`);
-          return res.status(500).send(response[2]);
+        const siteResponseData = JSON.parse(data);
+        
+        if (status !== 200 || siteResponseData.errorCode > 0) {
+          logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${listresult.msg}`);
+          return res.status(500).send(data);
         }
 
-        activeuser = clientresult.result.totalClientNum;
-        connectedAp = clientresult.result.connectedApNum;
-        connectedGateways = clientresult.result.connectedGatewayNum;
-        connectedSwitches = clientresult.result.connectedSwitchNum;
+        activeUser = siteResponseData.result.totalClientNum;
+        connectedAp = siteResponseData.result.connectedApNum;
+        connectedGateways = siteResponseData.result.connectedGatewayNum;
+        connectedSwitches = siteResponseData.result.connectedSwitchNum;
 
+        const alertUrl = (controllerVersionMajor === 4) ? 
+          `${url}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000` :
+          `${url}/${cId}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000`;
 
-        let alertUrl;
-        if (cversion >= "5.0.0") {
-          alertUrl = `${url}/${cid}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000`;
-        } else {
-          alertUrl = `${url}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000`;
-        }
-        response = await httpProxy(alertUrl, {
-          method: "GET",
+        [status, contentType, data] = await httpProxy(alertUrl, {
           headers: {
             "Csrf-Token": token,
           },
         });
-        const alertresult = JSON.parse(response[2]);
-        alerts = alertresult.result.alertNum;
+        const alertResponseData = JSON.parse(data);
+        alerts = alertResponseData.result.alertNum;
       }
 
       return res.send(JSON.stringify({
-        "connectedAp": connectedAp,
-        "activeUser": activeuser,
-        "alerts": alerts,
-        "connectedGateways": connectedGateways,
-        "connectedSwitches": connectedSwitches,
+        connectedAp,
+        activeUser,
+        alerts,
+        connectedGateways,
+        connectedSwitches,
       }));
     }
   }
+  
   return res.status(400).json({ error: "Invalid proxy service type" });
 }

From b01e6eaf5661e94112fed7f012f387a6839167a2 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 21 Dec 2022 12:51:20 -0800
Subject: [PATCH 153/347] Refactor Omada proxy for api v3

---
 src/widgets/omada/proxy.js | 100 ++++++++++++++++++-------------------
 1 file changed, 48 insertions(+), 52 deletions(-)

diff --git a/src/widgets/omada/proxy.js b/src/widgets/omada/proxy.js
index d5f4d9ba..d867e112 100644
--- a/src/widgets/omada/proxy.js
+++ b/src/widgets/omada/proxy.js
@@ -15,9 +15,12 @@ async function login(loginUrl, username, password, controllerVersionMajor) {
     password: password
   }
 
-  if (controllerVersionMajor < 4) {
-    params.method = "login";
-    params.name = username;
+  if (controllerVersionMajor === 3) {
+    params["method"] = "login";
+    params["params"] = {
+      name: username,
+      password
+    };
   }
   
   const [status, contentType, data] = await httpProxy(loginUrl, {
@@ -59,14 +62,14 @@ export default async function omadaProxyHandler(req, res) {
         return res.status(status).json({error: {message: `HTTP Error ${status}`, url: controllerInfoURL, data: data}});
       }
 
-      const cId = JSON.parse(data).result.omadacId;
+      let cId;
       let controllerVersion;
 
       try {
+        cId = JSON.parse(data).result.omadacId;
         controllerVersion = JSON.parse(data).result.controllerVer;
       } catch (e) {
-        // fallback to this random version?
-        controllerVersion = "3.2.17"
+        controllerVersion = "3.2.x"
       }
 
       const controllerVersionMajor = parseInt(controllerVersion.split('.')[0], 10)
@@ -134,7 +137,20 @@ export default async function omadaProxyHandler(req, res) {
 
       const sitesResponseData = JSON.parse(data);
 
-      let site;
+      if (sitesResponseData.errorCode > 0) {
+        logger.debug(`HTTTP ${status} getting sites list: ${requestresponse[2].msg}`);
+        return res.status(status).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
+      }
+
+      const site = (controllerVersionMajor === 3) ? 
+      sitesResponseData.result.siteList.find(site => site.name === widget.site):
+        sitesResponseData.result.data.find(site => site.name === widget.site);
+
+      if (!site) {
+        return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data}});
+      }
+
+      let siteResponseData;
 
       let connectedAp;
       let activeUser;
@@ -142,73 +158,53 @@ export default async function omadaProxyHandler(req, res) {
       let connectedGateways;
       let alerts;
 
-      if (sitesResponseData.errorCode > 0) {
-        logger.debug(`HTTTP ${status} getting sites list: ${requestresponse[2].msg}`);
-        return res.status(status).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
-      }
-
-      // on modern controller, we need to call two different endpoints
-      // on older controller, we can call one endpoint
-
       if (controllerVersionMajor === 3) {
-
-        // Switching site is really needed only for Omada 3.x.x controllers
-  
-        let switchUrl;
-  
-        site = listresult.result.siteList.filter(site => site.name === widget.site);
-        siteName = site[0].siteName;
-        switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
+        // Omada 3.x.x controller requires switching site
+        const switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
         method = "POST";
-        body = JSON.stringify({
+        body = {
           "method": "switchSite",
           "params": {
-            "siteName": siteName,
+            "siteName": site.siteName,
             "userName": widget.username
           }
-        });
+        };
         headers = { "Content-Type": "application/json" };
         params = { "token": token };
-        requestresponse = await httpProxy(switchUrl, {
+
+        [status, contentType, data] = await httpProxy(switchUrl, {
           method,
           params,
-          body: body.toString(),
+          body: JSON.stringify(body),
           headers,
         });
-        const switchresult = JSON.parse(requestresponse[2]);
-        if (switchresult.errorCode !== 0) {
-          logger.debug(`HTTTP ${requestresponse[0]} getting sites list: ${requestresponse[2]}`);
-          return res.status(requestresponse[0]).json({error: {message: "Error switching site", url, data: requestresponse[2]}});
+
+        const switchResponseData = JSON.parse(data);
+        if (status !== 200 || switchResponseData.errorCode > 0) {
+          logger.error(`HTTP ${status} getting sites list: ${data}`);
+          return res.status(status).json({error: {message: "Error switching site", url: switchUrl, data}});
         }
         
         const statsUrl = `${widget.url}/web/v1/controller?getGlobalStat=&token=${token}`;
-        const statResponse = await httpProxy(statsUrl, {
-          method: "POST",
-          params: { "token": token },
+        [status, contentType, data] = await httpProxy(statsUrl, {
+          method,
+          params,
           body: JSON.stringify({
             "method": "getGlobalStat",
           }),
-          headers: {
-            "Content-Type": "application/json",
-          },
+          headers
         });
 
-        const data = JSON.parse(statResponse[2]);
+        siteResponseData = JSON.parse(data);
 
-        if (data.errorCode !== 0) {
-          return res.status(statResponse[0]).json({error: {message: "Error getting stats", url, data: statResponse[2]}});
+        if (status !== 200 || siteResponseData.errorCode > 0) {
+          return res.status(status).json({error: {message: "Error getting stats", url: statsUrl, data}});
         }
-        connectedAp = data.result.connectedAp;
-        activeUser = data.result.activeUser;
-        alerts = data.result.alerts;
 
+        connectedAp = siteResponseData.result.connectedAp;
+        activeUser = siteResponseData.result.activeUser;
+        alerts = siteResponseData.result.alerts;
       } else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) {
-        site = sitesResponseData.result.data.find(site => site.name === widget.site);
-
-        if (site.length === 0) {
-          return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data}});
-        }
-
         const siteName = (controllerVersionMajor === 5) ? site.id : site.key;
         const siteStatsUrl = (controllerVersionMajor === 4) ? 
           `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000` :
@@ -220,7 +216,7 @@ export default async function omadaProxyHandler(req, res) {
           },
         });
 
-        const siteResponseData = JSON.parse(data);
+        siteResponseData = JSON.parse(data);
         
         if (status !== 200 || siteResponseData.errorCode > 0) {
           logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${listresult.msg}`);
@@ -254,6 +250,6 @@ export default async function omadaProxyHandler(req, res) {
       }));
     }
   }
-  
+
   return res.status(400).json({ error: "Invalid proxy service type" });
 }

From 952305492cf28fe523a6afac121bbfdd2d320608 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 21 Dec 2022 13:04:14 -0800
Subject: [PATCH 154/347] More Omada widget cleanup

---
 public/locales/en/common.json   | 13 +++----
 src/widgets/omada/component.jsx |  4 +--
 src/widgets/omada/proxy.js      | 61 ++++++++++++++++-----------------
 src/widgets/omada/widget.js     |  8 -----
 4 files changed, 35 insertions(+), 51 deletions(-)

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 78c5dce8..9f5637bf 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -89,14 +89,11 @@
         "no_active": "No Active Streams"
     },
     "omada": {
-      "activeUser": "Active devices",
-      "alerts": "Alerts",
-      "connectedAp": "Connected APs",
-      "isolatedAp": "Isolated APs",
-      "powerConsumption": "Power consumption",
-      "availablePorts"  : "Available ports",
-      "connectedGateway": "Connected gateways",
-      "connectedSwitches": "Connected switches"
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     },
     "nzbget": {
         "rate": "Rate",
diff --git a/src/widgets/omada/component.jsx b/src/widgets/omada/component.jsx
index d499da36..dee60842 100644
--- a/src/widgets/omada/component.jsx
+++ b/src/widgets/omada/component.jsx
@@ -9,7 +9,7 @@ export default function Component({ service }) {
 
   const { widget } = service;
 
-  const { data: omadaData, error: omadaAPIError } = useWidgetAPI(widget, "stats", {
+  const { data: omadaData, error: omadaAPIError } = useWidgetAPI(widget, {
     refreshInterval: 5000,
   });
 
@@ -23,8 +23,6 @@ export default function Component({ service }) {
         <Block label="omada.connectedAp" />
         <Block label="omada.activeUser" />
         <Block label="omada.alerts" />
-        <Block label="omada.connectedGateway" />
-        <Block label="omada.connectedSwitches" />
       </Container>
     );
   }
diff --git a/src/widgets/omada/proxy.js b/src/widgets/omada/proxy.js
index d867e112..e89ad81d 100644
--- a/src/widgets/omada/proxy.js
+++ b/src/widgets/omada/proxy.js
@@ -2,27 +2,26 @@
 import { httpProxy } from "utils/proxy/http";
 import getServiceWidget from "utils/config/service-helpers";
 import createLogger from "utils/logger";
-import widgets from "widgets/widgets";
 
 const proxyName = "omadaProxyHandler";
 
 const logger = createLogger(proxyName);
 
-
 async function login(loginUrl, username, password, controllerVersionMajor) {
   const params = {
-    username: username,
-    password: password
+    username,
+    password
   }
 
   if (controllerVersionMajor === 3) {
-    params["method"] = "login";
-    params["params"] = {
+    params.method = "login";
+    params.params = {
       name: username,
       password
     };
   }
-  
+
+  // eslint-disable-next-line no-unused-vars
   const [status, contentType, data] = await httpProxy(loginUrl, {
     method: "POST",
     body: JSON.stringify(params),
@@ -41,10 +40,6 @@ export default async function omadaProxyHandler(req, res) {
   if (group && service) {
     const widget = await getServiceWidget(group, service);
 
-    if (!widgets?.[widget.type]?.api) {
-      return res.status(403).json({ error: "Service does not support API calls" });
-    }
-
     if (widget) {
 
       const {url} = widget;
@@ -59,7 +54,7 @@ export default async function omadaProxyHandler(req, res) {
 
       if (status !== 200) {
         logger.error("Unable to retrieve Omada controller info");
-        return res.status(status).json({error: {message: `HTTP Error ${status}`, url: controllerInfoURL, data: data}});
+        return res.status(status).json({error: {message: `HTTP Error ${status}`, url: controllerInfoURL, data}});
       }
 
       let cId;
@@ -97,12 +92,11 @@ export default async function omadaProxyHandler(req, res) {
       const [loginStatus, loginResponseData] = await login(loginUrl, widget.username, widget.password, controllerVersionMajor);
 
       if (loginStatus !== 200 || loginResponseData.errorCode > 0) {
-        return res.status(requestresponse[0]).json({error: {message: "Error logging in to Oamda controller", url: loginUrl, data: loginResponseData}});
+        return res.status(status).json({error: {message: "Error logging in to Oamda controller", url: loginUrl, data: loginResponseData}});
       }
 
-      const token = loginResponseData.result.token;
+      const { token } = loginResponseData.result;
       
-      // List sites
       let sitesUrl;
       let body = {};
       let params = { token };
@@ -126,6 +120,8 @@ export default async function omadaProxyHandler(req, res) {
         case 5:
           sitesUrl = `${widget.url}/${cId}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
           break;
+        default:
+          break;
       }
       
       [status, contentType, data] = await httpProxy(sitesUrl, {
@@ -138,16 +134,16 @@ export default async function omadaProxyHandler(req, res) {
       const sitesResponseData = JSON.parse(data);
 
       if (sitesResponseData.errorCode > 0) {
-        logger.debug(`HTTTP ${status} getting sites list: ${requestresponse[2].msg}`);
-        return res.status(status).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
+        logger.debug(`HTTTP ${status} getting sites list: ${sitesResponseData.msg}`);
+        return res.status(status).json({error: {message: "Error getting sites list", url, data: sitesResponseData}});
       }
 
       const site = (controllerVersionMajor === 3) ? 
-      sitesResponseData.result.siteList.find(site => site.name === widget.site):
-        sitesResponseData.result.data.find(site => site.name === widget.site);
+        sitesResponseData.result.siteList.find(s => s.name === widget.site):
+        sitesResponseData.result.data.find(s => s.name === widget.site);
 
       if (!site) {
-        return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data}});
+        return res.status(status).json({error: {message: `Site ${widget.site} is not found`, url, data}});
       }
 
       let siteResponseData;
@@ -159,18 +155,18 @@ export default async function omadaProxyHandler(req, res) {
       let alerts;
 
       if (controllerVersionMajor === 3) {
-        // Omada 3.x.x controller requires switching site
+        // Omada v3 controller requires switching site
         const switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
         method = "POST";
         body = {
-          "method": "switchSite",
-          "params": {
-            "siteName": site.siteName,
-            "userName": widget.username
+          method: "switchSite",
+          params: {
+            siteName: site.siteName,
+            userName: widget.username
           }
         };
         headers = { "Content-Type": "application/json" };
-        params = { "token": token };
+        params = { token };
 
         [status, contentType, data] = await httpProxy(switchUrl, {
           method,
@@ -219,25 +215,26 @@ export default async function omadaProxyHandler(req, res) {
         siteResponseData = JSON.parse(data);
         
         if (status !== 200 || siteResponseData.errorCode > 0) {
-          logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${listresult.msg}`);
+          logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${siteResponseData.msg}`);
           return res.status(500).send(data);
         }
 
-        activeUser = siteResponseData.result.totalClientNum;
-        connectedAp = siteResponseData.result.connectedApNum;
-        connectedGateways = siteResponseData.result.connectedGatewayNum;
-        connectedSwitches = siteResponseData.result.connectedSwitchNum;
-
         const alertUrl = (controllerVersionMajor === 4) ? 
           `${url}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000` :
           `${url}/${cId}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000`;
 
+        // eslint-disable-next-line no-unused-vars
         [status, contentType, data] = await httpProxy(alertUrl, {
           headers: {
             "Csrf-Token": token,
           },
         });
         const alertResponseData = JSON.parse(data);
+
+        activeUser = siteResponseData.result.totalClientNum;
+        connectedAp = siteResponseData.result.connectedApNum;
+        connectedGateways = siteResponseData.result.connectedGatewayNum;
+        connectedSwitches = siteResponseData.result.connectedSwitchNum;
         alerts = alertResponseData.result.alertNum;
       }
 
diff --git a/src/widgets/omada/widget.js b/src/widgets/omada/widget.js
index 0ef4177e..5e32edad 100644
--- a/src/widgets/omada/widget.js
+++ b/src/widgets/omada/widget.js
@@ -1,15 +1,7 @@
 import omadaProxyHandler from "./proxy";
-// import genericProxyHandler from "../../utils/proxy/handlers/generic";
 
 const widget = {
-  api: "{url}/web/v1/{endpoint}",
   proxyHandler: omadaProxyHandler,
-
-  mappings: {
-    stats: {
-      endpoint: "controller",
-    }
-  }
 };
 
 export default widget;

From a9429e5335bb450c3ee1ad2f0dd2575d8d28c6b7 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 22 Dec 2022 09:27:13 -0800
Subject: [PATCH 155/347] Pihole allow auth, updated API endpoint

---
 src/widgets/pihole/component.jsx | 8 ++++----
 src/widgets/pihole/widget.js     | 6 +++---
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/widgets/pihole/component.jsx b/src/widgets/pihole/component.jsx
index f213ac6d..c39250d2 100644
--- a/src/widgets/pihole/component.jsx
+++ b/src/widgets/pihole/component.jsx
@@ -9,7 +9,7 @@ export default function Component({ service }) {
 
   const { widget } = service;
 
-  const { data: piholeData, error: piholeError } = useWidgetAPI(widget, "api.php");
+  const { data: piholeData, error: piholeError } = useWidgetAPI(widget, "summaryRaw");
 
   if (piholeError) {
     return <Container error={piholeError} />;
@@ -27,9 +27,9 @@ export default function Component({ service }) {
 
   return (
     <Container service={service}>
-      <Block label="pihole.queries" value={t("common.number", { value: piholeData.dns_queries_today })} />
-      <Block label="pihole.blocked" value={t("common.number", { value: piholeData.ads_blocked_today })} />
-      <Block label="pihole.gravity" value={t("common.number", { value: piholeData.domains_being_blocked })} />
+      <Block label="pihole.queries" value={t("common.number", { value: parseInt(piholeData.dns_queries_today, 10) })} />
+      <Block label="pihole.blocked" value={t("common.number", { value: parseInt(piholeData.ads_blocked_today, 10) })} />
+      <Block label="pihole.gravity" value={t("common.number", { value: parseInt(piholeData.domains_being_blocked, 10) })} />
     </Container>
   );
 }
diff --git a/src/widgets/pihole/widget.js b/src/widgets/pihole/widget.js
index b392cded..e7593810 100644
--- a/src/widgets/pihole/widget.js
+++ b/src/widgets/pihole/widget.js
@@ -1,12 +1,12 @@
 import genericProxyHandler from "utils/proxy/handlers/generic";
 
 const widget = {
-  api: "{url}/admin/{endpoint}",
+  api: "{url}/admin/api.php?{endpoint}&auth={key}",
   proxyHandler: genericProxyHandler,
 
   mappings: {
-    "api.php": {
-      endpoint: "api.php",
+    "summaryRaw": {
+      endpoint: "summaryRaw",
       validate: [
         "dns_queries_today",
         "ads_blocked_today",

From 61f77947ac215055d41923aeef6b4fbef3a242e2 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 22 Dec 2022 09:39:28 -0800
Subject: [PATCH 156/347] Update bug_report.yml

---
 .github/ISSUE_TEMPLATE/bug_report.yml | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 2972922b..704e5e21 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -68,9 +68,20 @@ body:
     id: browser-logs
     attributes:
       label: Browser Logs
-      description: Please review and provide any relevant logs from the browser, if relevant
+      description: Please review and provide any logs from the browser, if relevant
   - type: textarea
     id: other
     attributes:
       label: Other
-      description: Any other relevant details. E.g. service version or API version, docker version, etc.
+      description: Please include output from your troubleshooting tests, if relevant. Include any other relevant details. E.g. service version or API version, docker version, etc.
+  - type: checkboxes
+    id: pre-flight
+    attributes:
+      label: Before submitting, I have made sure to:
+      options:
+        - label: Check [the documentation](https://gethomepage.dev/)
+          required: true
+        - label: Follow [the troubleshooting guide](https://gethomepage.dev/en/more/troubleshooting/) (please include output above if applicable).
+          required: true
+        - label: Search [existing issues](https://github.com/benphelps/homepage/search?q=&type=issues) and [discussions](https://github.com/benphelps/homepage/search?q=&type=discussions).
+          required: true

From 04f803676a0c2a09e45fe81779ce4925e664a188 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 22 Dec 2022 09:39:52 -0800
Subject: [PATCH 157/347] Update bug_report.yml

---
 .github/ISSUE_TEMPLATE/bug_report.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 704e5e21..8ab44df5 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -77,7 +77,7 @@ body:
   - type: checkboxes
     id: pre-flight
     attributes:
-      label: Before submitting, I have made sure to:
+      label: Before submitting, I have made sure to
       options:
         - label: Check [the documentation](https://gethomepage.dev/)
           required: true

From 23ba45729eec7ed8998f66825f30b47eb3f06326 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 22 Dec 2022 10:54:03 -0800
Subject: [PATCH 158/347] Rename diskstation to downloadstation

---
 public/locales/en/common.json                    |  2 +-
 src/widgets/components.js                        |  2 +-
 .../component.jsx                                | 16 ++++++++--------
 .../{diskstation => downloadstation}/proxy.js    |  6 +++---
 .../{diskstation => downloadstation}/widget.js   |  4 ++--
 src/widgets/widgets.js                           |  5 +++--
 6 files changed, 18 insertions(+), 17 deletions(-)
 rename src/widgets/{diskstation => downloadstation}/component.jsx (64%)
 rename src/widgets/{diskstation => downloadstation}/proxy.js (92%)
 rename src/widgets/{diskstation => downloadstation}/widget.js (71%)

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index d8bfb039..ecfaec1c 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -126,7 +126,7 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
+    "downloadstation": {
         "download": "Download",
         "upload": "Upload",
         "leech": "Leech",
diff --git a/src/widgets/components.js b/src/widgets/components.js
index eb7c686f..2146fb79 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -8,7 +8,7 @@ const components = {
   changedetectionio: dynamic(() => import("./changedetectionio/component")),
   coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
   deluge: dynamic(() => import("./deluge/component")),
-  diskstation: dynamic(() => import("./diskstation/component")),
+  downloadstation: dynamic(() => import("./downloadstation/component")),
   docker: dynamic(() => import("./docker/component")),
   emby: dynamic(() => import("./emby/component")),
   flood: dynamic(() => import("./flood/component")),
diff --git a/src/widgets/diskstation/component.jsx b/src/widgets/downloadstation/component.jsx
similarity index 64%
rename from src/widgets/diskstation/component.jsx
rename to src/widgets/downloadstation/component.jsx
index 3a87eebc..a91d1891 100644
--- a/src/widgets/diskstation/component.jsx
+++ b/src/widgets/downloadstation/component.jsx
@@ -17,10 +17,10 @@ export default function Component({ service }) {
   if (!tasks) {
     return (
       <Container service={service}>
-        <Block label="diskstation.leech" />
-        <Block label="diskstation.download" />
-        <Block label="diskstation.seed" />
-        <Block label="diskstation.upload" />
+        <Block label="downloadstation.leech" />
+        <Block label="downloadstation.download" />
+        <Block label="downloadstation.seed" />
+        <Block label="downloadstation.upload" />
       </Container>
     );
   }
@@ -32,10 +32,10 @@ export default function Component({ service }) {
 
   return (
     <Container service={service}>
-      <Block label="diskstation.leech" value={t("common.number", { value: leech })} />
-      <Block label="diskstation.download" value={t("common.bitrate", { value: rateDl })} />
-      <Block label="diskstation.seed" value={t("common.number", { value: completed })} />
-      <Block label="diskstation.upload" value={t("common.bitrate", { value: rateUl })} />
+      <Block label="downloadstation.leech" value={t("common.number", { value: leech })} />
+      <Block label="downloadstation.download" value={t("common.bitrate", { value: rateDl })} />
+      <Block label="downloadstation.seed" value={t("common.number", { value: completed })} />
+      <Block label="downloadstation.upload" value={t("common.bitrate", { value: rateUl })} />
     </Container>
   );
 }
diff --git a/src/widgets/diskstation/proxy.js b/src/widgets/downloadstation/proxy.js
similarity index 92%
rename from src/widgets/diskstation/proxy.js
rename to src/widgets/downloadstation/proxy.js
index af767815..dc76a3cb 100644
--- a/src/widgets/diskstation/proxy.js
+++ b/src/widgets/downloadstation/proxy.js
@@ -4,7 +4,7 @@ import createLogger from "utils/logger";
 import widgets from "widgets/widgets";
 import getServiceWidget from "utils/config/service-helpers";
 
-const logger = createLogger("diskstationProxyHandler");
+const logger = createLogger("downloadstationProxyHandler");
 const authApi = "{url}/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie"
 
 async function login(widget) {
@@ -34,7 +34,7 @@ async function login(widget) {
   return [status, contentType, data];
 }
 
-export default async function diskstationProxyHandler(req, res) {
+export default async function downloadstationProxyHandler(req, res) {
   const { group, service, endpoint } = req.query;
 
   if (!group || !service) {
@@ -56,7 +56,7 @@ export default async function diskstationProxyHandler(req, res) {
 
   const json = JSON.parse(data.toString());
   if (json?.success !== true) {
-    logger.debug("Logging in to DiskStation");
+    logger.debug("Logging in to DownloadStation");
     [status, contentType, data] = await login(widget);
     if (status !== 200) {
       return res.status(status).end(data)
diff --git a/src/widgets/diskstation/widget.js b/src/widgets/downloadstation/widget.js
similarity index 71%
rename from src/widgets/diskstation/widget.js
rename to src/widgets/downloadstation/widget.js
index 71187425..38245adf 100644
--- a/src/widgets/diskstation/widget.js
+++ b/src/widgets/downloadstation/widget.js
@@ -1,8 +1,8 @@
-import diskstationProxyHandler from "./proxy";
+import downloadstationProxyHandler from "./proxy";
 
 const widget = {
   api: "{url}/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method={endpoint}",
-  proxyHandler: diskstationProxyHandler,
+  proxyHandler: downloadstationProxyHandler,
 
   mappings: {
     "list": {
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 2b45e55a..d7d7c253 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -5,7 +5,7 @@ import bazarr from "./bazarr/widget";
 import changedetectionio from "./changedetectionio/widget";
 import coinmarketcap from "./coinmarketcap/widget";
 import deluge from "./deluge/widget";
-import diskstation from "./diskstation/widget";
+import downloadstation from "./downloadstation/widget";
 import emby from "./emby/widget";
 import flood from "./flood/widget";
 import gluetun from "./gluetun/widget";
@@ -56,7 +56,8 @@ const widgets = {
   changedetectionio,
   coinmarketcap,
   deluge,
-  diskstation,
+  diskstation: downloadstation,
+  downloadstation,
   emby,
   flood,
   gluetun,

From cac21ebd38124c6291ab0965e88e265ac6444f74 Mon Sep 17 00:00:00 2001
From: Daniele Luisetto <daniele.luisetto1@gmail.com>
Date: Thu, 22 Dec 2022 22:51:16 +0000
Subject: [PATCH 159/347] Translated using Weblate (Italian)

Currently translated at 84.5% (230 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index e3381246..d900b92b 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -40,7 +40,7 @@
         "api_error": "Errore API",
         "status": "Stato",
         "url": "URL",
-        "information": "Information",
+        "information": "Informazione",
         "raw_error": "Raw Error",
         "response_data": "Response Data"
     },

From 6b90d3ef2853deac81a8041e95ffc334f7347556 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 22 Dec 2022 21:16:52 -0800
Subject: [PATCH 160/347] Handle docker server failures if others succeed

---
 src/utils/config/api-response.js    |  6 +--
 src/utils/config/service-helpers.js | 63 ++++++++++++++++-------------
 2 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/src/utils/config/api-response.js b/src/utils/config/api-response.js
index b8de959f..a3450537 100644
--- a/src/utils/config/api-response.js
+++ b/src/utils/config/api-response.js
@@ -52,7 +52,7 @@ export async function servicesResponse() {
     discoveredServices = cleanServiceGroups(await servicesFromDocker());
   } catch (e) {
     console.error("Failed to discover services, please check docker.yaml for errors or remove example entries.");
-    if (e) console.error(e);
+    if (e) console.error(e.toString());
     discoveredServices = [];
   }
 
@@ -60,7 +60,7 @@ export async function servicesResponse() {
     configuredServices = cleanServiceGroups(await servicesFromConfig());
   } catch (e) {
     console.error("Failed to load services.yaml, please check for errors");
-    if (e) console.error(e);
+    if (e) console.error(e.toString());
     configuredServices = [];
   }
 
@@ -68,7 +68,7 @@ export async function servicesResponse() {
     initialSettings = await getSettings();
   } catch (e) {
     console.error("Failed to load settings.yaml, please check for errors");
-    if (e) console.error(e);
+    if (e) console.error(e.toString());
     initialSettings = {};
   }
 
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index 623b7d6b..cccd010b 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -44,39 +44,48 @@ export async function servicesFromDocker() {
 
   const serviceServers = await Promise.all(
     Object.keys(servers).map(async (serverName) => {
-      const docker = new Docker(getDockerArguments(serverName).conn);
-      const containers = await docker.listContainers({
-        all: true,
-      });
-
-      // bad docker connections can result in a <Buffer ...> object?
-      // in any case, this ensures the result is the expected array
-      if (!Array.isArray(containers)) {
-        return [];
-      }
-
-      const discovered = containers.map((container) => {
-        let constructedService = null;
-
-        Object.keys(container.Labels).forEach((label) => {
-          if (label.startsWith("homepage.")) {
-            if (!constructedService) {
-              constructedService = {
-                container: container.Names[0].replace(/^\//, ""),
-                server: serverName,
-              };
-            }
-            shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
-          }
+      try {
+        const docker = new Docker(getDockerArguments(serverName).conn);
+        const containers = await docker.listContainers({
+          all: true,
         });
 
-        return constructedService;
-      });
+        // bad docker connections can result in a <Buffer ...> object?
+        // in any case, this ensures the result is the expected array
+        if (!Array.isArray(containers)) {
+          return [];
+        }
 
-      return { server: serverName, services: discovered.filter((filteredService) => filteredService) };
+        const discovered = containers.map((container) => {
+          let constructedService = null;
+
+          Object.keys(container.Labels).forEach((label) => {
+            if (label.startsWith("homepage.")) {
+              if (!constructedService) {
+                constructedService = {
+                  container: container.Names[0].replace(/^\//, ""),
+                  server: serverName,
+                };
+              }
+              shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
+            }
+          });
+
+          return constructedService;
+        });
+
+        return { server: serverName, services: discovered.filter((filteredService) => filteredService) };
+      } catch (e) {
+        // a server failed, but others may succeed
+        return { server: serverName, services: [] };
+      }
     })
   );
 
+  if (serviceServers.every(server => server.services.length === 0)) {
+    throw new Error('All docker servers failed to connect or returned no containers');
+  }
+
   const mappedServiceGroups = [];
 
   serviceServers.forEach((server) => {

From df72dcfc7fd8c167a77842533f15c2d2269c7258 Mon Sep 17 00:00:00 2001
From: Daniele Luisetto <daniele.luisetto1@gmail.com>
Date: Thu, 22 Dec 2022 22:55:05 +0000
Subject: [PATCH 161/347] Translated using Weblate (Italian)

Currently translated at 100.0% (272 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 64 +++++++++++++++++------------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index d900b92b..f3d4f3fa 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -5,18 +5,18 @@
         "cpu": "CPU",
         "offline": "Offline",
         "rx": "RX",
-        "error": "Error",
-        "unknown": "Unknown"
+        "error": "Errore",
+        "unknown": "Sconosciuto"
     },
     "emby": {
         "playing": "In riproduzione",
-        "transcoding": "Transcoding",
+        "transcoding": "Transcodifica",
         "bitrate": "Bitrate",
         "no_active": "Nessuno Stream Attivo"
     },
     "tautulli": {
         "playing": "In riproduzione",
-        "transcoding": "Transcoding",
+        "transcoding": "Transcodifica",
         "bitrate": "Bitrate",
         "no_active": "Nessuno Stream Attivo"
     },
@@ -31,7 +31,7 @@
         "total": "Totali"
     },
     "traefik": {
-        "routers": "Routers",
+        "routers": "Router",
         "services": "Servizi",
         "middleware": "Middleware"
     },
@@ -42,7 +42,7 @@
         "url": "URL",
         "information": "Informazione",
         "raw_error": "Raw Error",
-        "response_data": "Response Data"
+        "response_data": "Dati risposta"
     },
     "search": {
         "placeholder": "Cerca…"
@@ -105,7 +105,7 @@
         "pending": "In attesa",
         "approved": "Approvati",
         "available": "Disponibili",
-        "processing": "Processing"
+        "processing": "In lavorazione"
     },
     "sabnzbd": {
         "rate": "Rapporto",
@@ -126,13 +126,13 @@
     },
     "gotify": {
         "apps": "Applicazioni",
-        "clients": "Clients",
+        "clients": "Client",
         "messages": "Messaggi"
     },
     "prowlarr": {
         "enableIndexers": "Indicizzatori",
         "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
+        "numberOfQueries": "Interrogazioni",
         "numberOfFailGrabs": "Grabs Falliti",
         "numberOfFailQueries": "Queries Fallite"
     },
@@ -153,10 +153,10 @@
     "lidarr": {
         "wanted": "Mancanti",
         "queued": "In coda",
-        "albums": "Albums"
+        "albums": "Album"
     },
     "adguard": {
-        "queries": "Queries",
+        "queries": "Interrogazioni",
         "blocked": "Bloccati",
         "filtered": "Filtrati",
         "latency": "Latenza"
@@ -304,12 +304,12 @@
         "downloads": "Coda",
         "videos": "Video",
         "channels": "Canali",
-        "playlists": "Playlists"
+        "playlists": "Playlist"
     },
     "truenas": {
         "load": "Carico di Sistema",
-        "uptime": "Uptime",
-        "alerts": "Alerts",
+        "uptime": "Tempo di attività",
+        "alerts": "Avvisi",
         "time": "{{value, number(style: unit; unitDisplay: long;)}}"
     },
     "navidrome": {
@@ -323,26 +323,26 @@
         "total": "Totale"
     },
     "gluetun": {
-        "public_ip": "Public IP",
-        "region": "Region",
-        "country": "Country"
+        "public_ip": "IP pubblico",
+        "region": "Località",
+        "country": "Stato"
     },
     "hdhomerun": {
-        "channels": "Channels",
+        "channels": "Canali",
         "hd": "HD"
     },
     "ping": {
-        "error": "Error",
+        "error": "Errore",
         "ping": "Ping"
     },
     "scrutiny": {
-        "passed": "Passed",
-        "failed": "Failed",
-        "unknown": "Unknown"
+        "passed": "Passati",
+        "failed": "Falliti",
+        "unknown": "Sconosciuto"
     },
     "paperlessngx": {
-        "inbox": "Inbox",
-        "total": "Total"
+        "inbox": "In arrivo",
+        "total": "Totali"
     },
     "deluge": {
         "download": "Download",
@@ -363,18 +363,18 @@
         "seed": "Seed"
     },
     "tdarr": {
-        "queue": "Queue",
-        "processed": "Processed",
-        "errored": "Errored",
-        "saved": "Saved"
+        "queue": "In coda",
+        "processed": "Elaborati",
+        "errored": "Errori",
+        "saved": "Salvati"
     },
     "miniflux": {
-        "unread": "Unread",
-        "read": "Read"
+        "unread": "Non letti",
+        "read": "Letti"
     },
     "nextdns": {
-        "wait": "Please Wait",
-        "no_devices": "No Device Data Received"
+        "wait": "Attendi",
+        "no_devices": "Nessun dato del dispositivo ricevuto"
     },
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",

From ce629128e15401d0e3698a54371362142455eac7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:22 +0000
Subject: [PATCH 162/347] Translated using Weblate (German)

Currently translated at 82.3% (228 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 0cd9ecb0..6e6cf025 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From f48a214024440ecbdff6ff73df90dc75d98682ef Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:22 +0000
Subject: [PATCH 163/347] Translated using Weblate (Spanish)

Currently translated at 98.1% (272 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 37926546..d5c35c1f 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From a535d052ec0d66ebf12e2016e9c3b3c40455ae70 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:23 +0000
Subject: [PATCH 164/347] Translated using Weblate (French)

Currently translated at 98.1% (272 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 90fb83b1..37c888ee 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibitrate": "{{value, rate(bits: true; binary: true)}}",
         "bibyterate": "{{value, rate(bits: false; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 34673e9bb50f9a351ab5b1154fc521342f81e784 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:23 +0000
Subject: [PATCH 165/347] Translated using Weblate (Portuguese)

Currently translated at 59.2% (164 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 0f49be33..ee78fc0c 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -388,5 +388,12 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 1f5aac7e8f0d14f82a021de306dc8e33905ca500 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:24 +0000
Subject: [PATCH 166/347] Translated using Weblate (Russian)

Currently translated at 17.3% (48 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 0355083a..7e265c07 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedSwitches": "Connected switches",
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways"
     }
 }

From c29e97a738361f1a996d158b981cc328f8c43b63 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:24 +0000
Subject: [PATCH 167/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 60.6% (168 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index 2ab75c3b..6196a4e9 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From f26af72dbe4b7776bf38c40ee0ac65a1fdc66d1c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:24 +0000
Subject: [PATCH 168/347] Translated using Weblate (Italian)

Currently translated at 98.1% (272 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index f3d4f3fa..3379bebb 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 0083379d96d2d1fa4a1970d7e1666138f76b983c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:22 +0000
Subject: [PATCH 169/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 28.5% (79 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 070d31e2..c81aac82 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 155ef115962569e6b262bdc0c64a15b89b11e9c5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:24 +0000
Subject: [PATCH 170/347] Translated using Weblate (Vietnamese)

Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index d33a94c9..db36cef2 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From c3de335f2d1f0f6c41bd316faddb45ecd5775b44 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:25 +0000
Subject: [PATCH 171/347] Translated using Weblate (Dutch)

Currently translated at 22.7% (63 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 3e549a8c..2fba03fa 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 966dabe3b5284be86654701fcd2641b1d02cc278 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:26 +0000
Subject: [PATCH 172/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 045bef50..97d711cb 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 17f289b00b6f048a06055f8a8e0f2a8e76ea9866 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:16 +0000
Subject: [PATCH 173/347] Translated using Weblate (Catalan)

Currently translated at 94.5% (262 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 02102cbd..0e1f6b46 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From f34e7c96408cb198effe4c389467034fce9af777 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:20 +0000
Subject: [PATCH 174/347] Translated using Weblate (Polish)

Currently translated at 93.1% (258 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index d7bed406..d9dd34a6 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedSwitches": "Connected switches",
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways"
     }
 }

From c4e557451828764612cd4778c5900b38084f95aa Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:14 +0000
Subject: [PATCH 175/347] Translated using Weblate (Swedish)

Currently translated at 46.9% (130 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 6da46d40..98b477bc 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From ca1af07affa25dd24f3c2e43cda787c544846188 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:15 +0000
Subject: [PATCH 176/347] Translated using Weblate (Croatian)

Currently translated at 92.4% (256 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index f507125e..9e182adb 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From e4728e2cc982324f76333ee8a1b1a15d254d6376 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:17 +0000
Subject: [PATCH 177/347] Translated using Weblate (Hungarian)

Currently translated at 38.9% (108 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index b28a0e4f..2654cd0c 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedAp": "Connected APs",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 7a696367948ce7a424405cc81b362007120f9ee8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:15 +0000
Subject: [PATCH 178/347] Translated using Weblate (Hebrew)

Currently translated at 36.4% (101 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index eeeee0a6..8acd1f91 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 0aa8439301439264396f476d1ae59a7e516c980e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:17 +0000
Subject: [PATCH 179/347] Translated using Weblate (Romanian)

Currently translated at 49.4% (137 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 5e28a94f..007b3331 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From e908bc2078ebc484a99e6609a2b9c2698172d175 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:18 +0000
Subject: [PATCH 180/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 42.2% (117 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 51147130..ec062c3e 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 3466732b8ec70781aa759dc39899d5ecb9251bef Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:16 +0000
Subject: [PATCH 181/347] Translated using Weblate (Yue)

Currently translated at 42.5% (118 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 09237cc9..719aea6b 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From a5f4e81d37d9378d30d1ba3a9cb92457abe6e552 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:20 +0000
Subject: [PATCH 182/347] Translated using Weblate (Finnish)

Currently translated at 44.4% (123 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index d84bb349..79ac054e 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedSwitches": "Connected switches",
+        "connectedGateway": "Connected gateways"
     }
 }

From b903240b4082b947203c0218b1b19e91bc2ebe19 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:20 +0000
Subject: [PATCH 183/347] Translated using Weblate (Telugu)

Currently translated at 78.3% (217 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 7a283f79..0ba47a56 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 7f1ea3f67b03f23d0afe708664030a2d1703fc57 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:21 +0000
Subject: [PATCH 184/347] Translated using Weblate (Bulgarian)

Currently translated at 16.6% (46 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 4437e1a7..051cdc8b 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From b4682aebd6b619582fa8be119abaf83f8ba26555 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:17 +0000
Subject: [PATCH 185/347] Translated using Weblate (Turkish)

Currently translated at 83.3% (231 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 45042d77..b7e18d3a 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 35c6e9279942460cb73986b06d9d5ca896f6985a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:19 +0000
Subject: [PATCH 186/347] Translated using Weblate (Serbian)

Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 67c4ecc2..b39ec6c7 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 15a0e77450124305ebcdb231a1898c79a0fdbd5e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:18 +0000
Subject: [PATCH 187/347] Translated using Weblate (Arabic)

Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index 659a87d6..021e70bd 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 7c14e682e7def6da2512fb2c19141814c7a306ad Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:21 +0000
Subject: [PATCH 188/347] Translated using Weblate (Czech)

Currently translated at 81.2% (225 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index d0e4a87d..0e172cba 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From 6f912bfcdc5b9395fbe5ae3b96cad927e4036a2d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:21 +0000
Subject: [PATCH 189/347] Translated using Weblate (Danish)

Currently translated at 71.4% (198 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 3746f93a..a5d12ce3 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From ff54a8d1c39d5c462b1d5c613093d8c26b0c2927 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:25 +0000
Subject: [PATCH 190/347] Translated using Weblate (Malay)

Currently translated at 91.3% (253 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 34fd1da5..d667fd32 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From bbfe92cda6a7e05f6773b24ad7e31430a6dd98f8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:18 +0000
Subject: [PATCH 191/347] Translated using Weblate (Hindi)

Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index a4c33ac6..6e00b9fc 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From f63732fd199f4e4bbfcf7fec9a8e7f2a9e12a39a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 05:24:19 +0000
Subject: [PATCH 192/347] Translated using Weblate (Esperanto)

Currently translated at 37.1% (103 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index 9633f29a..3a982a6b 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -379,5 +379,12 @@
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices",
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches"
     }
 }

From e7db56101bc6ab70102a5ecdbeeca19191771376 Mon Sep 17 00:00:00 2001
From: Marcus Kimpenhaus <k@AirM2.kimpenhaus.net>
Date: Fri, 23 Dec 2022 14:20:12 +0100
Subject: [PATCH 193/347] fixed number formatting in widgets: radarr, sonarr,
 overseerr

---
 src/widgets/overseerr/component.jsx | 11 +++++++----
 src/widgets/radarr/component.jsx    | 11 +++++++----
 src/widgets/sonarr/component.jsx    |  9 ++++++---
 3 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/widgets/overseerr/component.jsx b/src/widgets/overseerr/component.jsx
index 230a166c..dcb5237c 100644
--- a/src/widgets/overseerr/component.jsx
+++ b/src/widgets/overseerr/component.jsx
@@ -1,8 +1,11 @@
+import { useTranslation } from "next-i18next";
+
 import Container from "components/services/widget/container";
 import Block from "components/services/widget/block";
 import useWidgetAPI from "utils/proxy/use-widget-api";
 
 export default function Component({ service }) {
+  const { t } = useTranslation();
   const { widget } = service;
 
   const { data: statsData, error: statsError } = useWidgetAPI(widget, "request/count");
@@ -24,10 +27,10 @@ export default function Component({ service }) {
 
   return (
     <Container service={service}>
-      <Block label="overseerr.pending" value={statsData.pending} />
-      <Block label="overseerr.processing" value={statsData.processing} />
-      <Block label="overseerr.approved" value={statsData.approved} />
-      <Block label="overseerr.available" value={statsData.available} />
+      <Block label="overseerr.pending" value={t("common.number", { value: statsData.pending })} />
+      <Block label="overseerr.processing" value={t("common.number", { value: statsData.processing })} />
+      <Block label="overseerr.approved" value={t("common.number", { value: statsData.approved })} />
+      <Block label="overseerr.available" value={t("common.number", { value: statsData.available })} />
     </Container>
   );
 }
diff --git a/src/widgets/radarr/component.jsx b/src/widgets/radarr/component.jsx
index f2620b78..4d8eeee8 100644
--- a/src/widgets/radarr/component.jsx
+++ b/src/widgets/radarr/component.jsx
@@ -1,8 +1,11 @@
+import { useTranslation } from "next-i18next";
+
 import Container from "components/services/widget/container";
 import Block from "components/services/widget/block";
 import useWidgetAPI from "utils/proxy/use-widget-api";
 
 export default function Component({ service }) {
+  const { t } = useTranslation();
   const { widget } = service;
 
   const { data: moviesData, error: moviesError } = useWidgetAPI(widget, "movie");
@@ -26,10 +29,10 @@ export default function Component({ service }) {
 
   return (
     <Container service={service}>
-      <Block label="radarr.wanted" value={moviesData.wanted} />
-      <Block label="radarr.missing" value={moviesData.missing} />
-      <Block label="radarr.queued" value={queuedData.totalCount} />
-      <Block label="radarr.movies" value={moviesData.have} />
+      <Block label="radarr.wanted" value={t("common.number", { value: moviesData.wanted })} />
+      <Block label="radarr.missing" value={t("common.number", { value: moviesData.missing })} />
+      <Block label="radarr.queued" value={t("common.number", { value: queuedData.totalCount })} />
+      <Block label="radarr.movies" value={t("common.number", { value: moviesData.have })} />
     </Container>
   );
 }
diff --git a/src/widgets/sonarr/component.jsx b/src/widgets/sonarr/component.jsx
index 14dd3328..fd6ba9dc 100644
--- a/src/widgets/sonarr/component.jsx
+++ b/src/widgets/sonarr/component.jsx
@@ -1,8 +1,11 @@
+import { useTranslation } from "next-i18next";
+
 import Container from "components/services/widget/container";
 import Block from "components/services/widget/block";
 import useWidgetAPI from "utils/proxy/use-widget-api";
 
 export default function Component({ service }) {
+  const { t } = useTranslation();
   const { widget } = service;
 
   const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing");
@@ -26,9 +29,9 @@ export default function Component({ service }) {
 
   return (
     <Container service={service}>
-      <Block label="sonarr.wanted" value={wantedData.totalRecords} />
-      <Block label="sonarr.queued" value={queuedData.totalRecords} />
-      <Block label="sonarr.series" value={seriesData.total} />
+      <Block label="sonarr.wanted" value={t("common.number", { value: wantedData.totalRecords })} />
+      <Block label="sonarr.queued" value={t("common.number", { value: queuedData.totalRecords })} />
+      <Block label="sonarr.series" value={t("common.number", { value: seriesData.total })} />
     </Container>
   );
 }

From 1cac02f2c0942b115c50fb03a73845372ca101d9 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 23 Dec 2022 08:30:52 -0800
Subject: [PATCH 194/347] Add number formatting to prowlarr

https://github.com/benphelps/homepage/pull/721#issuecomment-1364092798
---
 src/widgets/prowlarr/component.jsx | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/widgets/prowlarr/component.jsx b/src/widgets/prowlarr/component.jsx
index 890679e5..b4948a49 100644
--- a/src/widgets/prowlarr/component.jsx
+++ b/src/widgets/prowlarr/component.jsx
@@ -1,8 +1,10 @@
 import Container from "components/services/widget/container";
 import Block from "components/services/widget/block";
 import useWidgetAPI from "utils/proxy/use-widget-api";
+import { useTranslation } from "react-i18next";
 
 export default function Component({ service }) {
+  const { t } = useTranslation();
   const { widget } = service;
 
   const { data: indexersData, error: indexersError } = useWidgetAPI(widget, "indexer");
@@ -40,11 +42,11 @@ export default function Component({ service }) {
 
   return (
     <Container service={service}>
-      <Block label="prowlarr.enableIndexers" value={indexers.length} />
-      <Block label="prowlarr.numberOfGrabs" value={numberOfGrabs} />
-      <Block label="prowlarr.numberOfQueries" value={numberOfQueries} />
-      <Block label="prowlarr.numberOfFailGrabs" value={numberOfFailedGrabs} />
-      <Block label="prowlarr.numberOfFailQueries" value={numberOfFailedQueries} />
+      <Block label="prowlarr.enableIndexers" value={t("common.number", { value: indexers.length })} />
+      <Block label="prowlarr.numberOfGrabs" value={t("common.number", { value: numberOfGrabs })} />
+      <Block label="prowlarr.numberOfQueries" value={t("common.number", { value: numberOfQueries })} />
+      <Block label="prowlarr.numberOfFailGrabs" value={t("common.number", { value: numberOfFailedGrabs })} />
+      <Block label="prowlarr.numberOfFailQueries" value={t("common.number", { value: numberOfFailedQueries })} />
     </Container>
   );
 }

From c8ea72c21783e851ea7ff85bb832b6080cc8044f Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 23 Dec 2022 08:38:52 -0800
Subject: [PATCH 195/347] lint

---
 src/widgets/prowlarr/component.jsx | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/widgets/prowlarr/component.jsx b/src/widgets/prowlarr/component.jsx
index b4948a49..c5840e24 100644
--- a/src/widgets/prowlarr/component.jsx
+++ b/src/widgets/prowlarr/component.jsx
@@ -1,7 +1,8 @@
+import { useTranslation } from "react-i18next";
+
 import Container from "components/services/widget/container";
 import Block from "components/services/widget/block";
 import useWidgetAPI from "utils/proxy/use-widget-api";
-import { useTranslation } from "react-i18next";
 
 export default function Component({ service }) {
   const { t } = useTranslation();

From 79176852b87bd85fe587030d11bd01ca0e254bfe Mon Sep 17 00:00:00 2001
From: gallegonovato <fran-carro@hotmail.es>
Date: Fri, 23 Dec 2022 10:33:07 +0000
Subject: [PATCH 196/347] Translated using Weblate (Spanish)

Currently translated at 100.0% (277 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index d5c35c1f..36216a8d 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -381,10 +381,10 @@
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     },
     "omada": {
-        "connectedAp": "Connected APs",
-        "activeUser": "Active devices",
-        "alerts": "Alerts",
-        "connectedGateway": "Connected gateways",
-        "connectedSwitches": "Connected switches"
+        "connectedAp": "AP conectados",
+        "activeUser": "Dispositivos activos",
+        "alerts": "Alertas",
+        "connectedGateway": "Pasarelas conectadas",
+        "connectedSwitches": "Interruptores conectados"
     }
 }

From d1dce8b6058f99c4b5c62ff1b1f3c8a5f314efee Mon Sep 17 00:00:00 2001
From: Nonoss117 <nonoss117@gmail.com>
Date: Fri, 23 Dec 2022 06:03:34 +0000
Subject: [PATCH 197/347] Translated using Weblate (French)

Currently translated at 100.0% (277 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 37c888ee..b88c733b 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -381,10 +381,10 @@
         "bibyterate": "{{value, rate(bits: false; binary: true)}}"
     },
     "omada": {
-        "connectedAp": "Connected APs",
-        "activeUser": "Active devices",
-        "alerts": "Alerts",
-        "connectedGateway": "Connected gateways",
-        "connectedSwitches": "Connected switches"
+        "connectedAp": "APs connectées",
+        "activeUser": "Équipts actifs",
+        "alerts": "Alertes",
+        "connectedGateway": "Passerelles connectées",
+        "connectedSwitches": "Switches connectés"
     }
 }

From da32e54a4b7f40d1399c6e202251699f126f93c9 Mon Sep 17 00:00:00 2001
From: Hosted Weblate <hosted@weblate.org>
Date: Fri, 23 Dec 2022 17:46:43 +0100
Subject: [PATCH 198/347] Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
---
 public/locales/ar/common.json      | 2 --
 public/locales/bg/common.json      | 2 --
 public/locales/ca/common.json      | 2 --
 public/locales/cs/common.json      | 2 --
 public/locales/da/common.json      | 2 --
 public/locales/de/common.json      | 2 --
 public/locales/eo/common.json      | 2 --
 public/locales/es/common.json      | 2 --
 public/locales/fi/common.json      | 2 --
 public/locales/fr/common.json      | 2 --
 public/locales/he/common.json      | 2 --
 public/locales/hi/common.json      | 2 --
 public/locales/hr/common.json      | 2 --
 public/locales/hu/common.json      | 2 --
 public/locales/it/common.json      | 2 --
 public/locales/ms/common.json      | 2 --
 public/locales/nb-NO/common.json   | 2 --
 public/locales/nl/common.json      | 2 --
 public/locales/pl/common.json      | 2 --
 public/locales/pt-BR/common.json   | 2 --
 public/locales/pt/common.json      | 2 --
 public/locales/ro/common.json      | 2 --
 public/locales/ru/common.json      | 2 --
 public/locales/sr/common.json      | 2 --
 public/locales/sv/common.json      | 2 --
 public/locales/te/common.json      | 2 --
 public/locales/tr/common.json      | 2 --
 public/locales/vi/common.json      | 2 --
 public/locales/yue/common.json     | 2 --
 public/locales/zh-CN/common.json   | 2 --
 public/locales/zh-Hant/common.json | 2 --
 31 files changed, 62 deletions(-)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index 021e70bd..02e65184 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "leech": "Leech",
         "seed": "Seed",
-        "download": "Download",
         "upload": "Upload"
     },
     "flood": {
diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 051cdc8b..2a46dfcd 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "seed": "Seed",
         "download": "Download",
-        "upload": "Upload",
         "leech": "Leech"
     },
     "flood": {
diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 0e1f6b46..6b2e8af6 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -351,9 +351,7 @@
         "leech": "Company"
     },
     "diskstation": {
-        "download": "Descàrrega",
         "upload": "Pujada",
-        "leech": "Company",
         "seed": "Llavor"
     },
     "flood": {
diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 0e172cba..58ae8f6b 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -351,9 +351,7 @@
         "download": "Download"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index a5d12ce3..41e70f5a 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 6e6cf025..fda26589 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index 3a982a6b..3802774e 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -351,9 +351,7 @@
         "total": "Totalo"
     },
     "diskstation": {
-        "download": "Download",
         "leech": "Leech",
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 36216a8d..ec400f49 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -351,9 +351,7 @@
         "seed": "Semilla"
     },
     "diskstation": {
-        "download": "Descargar",
         "upload": "Cargar",
-        "leech": "Leech",
         "seed": "Semilla"
     },
     "flood": {
diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 79ac054e..571b4017 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -351,9 +351,7 @@
         "download": "Download"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index b88c733b..10f35247 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Réception",
         "upload": "Envoi",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 8acd1f91..20d489ee 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "leech": "Leech",
-        "download": "Download",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 6e00b9fc..d5529fd5 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 9e182adb..9301e3ec 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Preuzimanje",
         "upload": "Prijenos",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 2654cd0c..bb0993ef 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -351,9 +351,7 @@
         "leech": "Leech"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 3379bebb..034c90bd 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index d667fd32..1394876f 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "download": "Download",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index c81aac82..180dcff6 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "leech": "Leech",
         "download": "Download",
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 2fba03fa..746a0152 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index d9dd34a6..dd24de57 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Pobieranie",
         "upload": "Wysyłanie",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index ec062c3e..a146cb10 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index ee78fc0c..b39310eb 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -364,9 +364,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 007b3331..abe6d5fc 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 7e265c07..dda739a5 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "seed": "Seed",
         "leech": "Leech"
     },
     "flood": {
diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index b39ec6c7..d4f9cc5c 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 98b477bc..9458adfe 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 0ba47a56..3999045e 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -351,9 +351,7 @@
         "leech": "Leech"
     },
     "diskstation": {
-        "leech": "Leech",
         "download": "Download",
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index b7e18d3a..0d436900 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index db36cef2..9a9c65c8 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 719aea6b..4d07768c 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index 6196a4e9..4a81ef4a 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 97d711cb..2018a46e 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -351,9 +351,7 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "upload": "Upload",
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {

From 3e86920b95959d49047ef23dd310308224d6e059 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:58 +0000
Subject: [PATCH 199/347] Translated using Weblate (German)

Currently translated at 82.3% (228 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index fda26589..cfc7b19d 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 805d57bf31193e6efe751fbceed30071dfa3ffb8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:59 +0000
Subject: [PATCH 200/347] Translated using Weblate (Spanish)

Currently translated at 98.5% (273 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index ec400f49..9af87af9 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -351,7 +351,6 @@
         "seed": "Semilla"
     },
     "diskstation": {
-        "upload": "Cargar",
         "seed": "Semilla"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alertas",
         "connectedGateway": "Pasarelas conectadas",
         "connectedSwitches": "Interruptores conectados"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From caa97f774eecc4ae7b24ed4aa2aeb6521cb9fc01 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:59 +0000
Subject: [PATCH 201/347] Translated using Weblate (French)

Currently translated at 98.5% (273 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 10f35247..ca058bec 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Envoi",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alertes",
         "connectedGateway": "Passerelles connectées",
         "connectedSwitches": "Switches connectés"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 4a747f1f93895dc0bdcac316e17a8b676130bb41 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:59 +0000
Subject: [PATCH 202/347] Translated using Weblate (Portuguese)

Currently translated at 59.2% (164 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index b39310eb..d3ecf7d4 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -364,7 +364,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -393,5 +392,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 303acc24f625b62d15a3fa59cb12b85a1e3f4dec Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:59 +0000
Subject: [PATCH 203/347] Translated using Weblate (Russian)

Currently translated at 17.3% (48 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index dda739a5..ebd447cf 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "leech": "Leech"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "activeUser": "Active devices",
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 3722caee73838d4cdee8087baa6c88d5a73ab1e9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:47:00 +0000
Subject: [PATCH 204/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 60.6% (168 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index 4a81ef4a..218d35e6 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 05c0f393545b0f685ab3b2724636c7dc5a49e597 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:47:00 +0000
Subject: [PATCH 205/347] Translated using Weblate (Italian)

Currently translated at 96.7% (268 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 034c90bd..1fc7eac4 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From efe763fff892e2c5c86fd197961000e6aefc28eb Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:58 +0000
Subject: [PATCH 206/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 28.5% (79 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 180dcff6..3cae63da 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 874a51f56c5d7d1d731cc847654277387cd91125 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:47:00 +0000
Subject: [PATCH 207/347] Translated using Weblate (Vietnamese)

Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index 9a9c65c8..3abc6512 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 3f523111b3b86326c5ca807a39c67d9a0f18d059 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:47:00 +0000
Subject: [PATCH 208/347] Translated using Weblate (Dutch)

Currently translated at 22.7% (63 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 746a0152..c4698aa7 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From b7e58ae07be7020a80c08bdefefa29ca6bdc7b9c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:47:01 +0000
Subject: [PATCH 209/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 2018a46e..edadf493 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 2400357666ae31d133bdedcf676db5e1a641dc28 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:54 +0000
Subject: [PATCH 210/347] Translated using Weblate (Catalan)

Currently translated at 93.1% (258 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 6b2e8af6..b202a699 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -351,7 +351,6 @@
         "leech": "Company"
     },
     "diskstation": {
-        "upload": "Pujada",
         "seed": "Llavor"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 5c8b82173270a51683eddec5ab636aaeda6b80b6 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:57 +0000
Subject: [PATCH 211/347] Translated using Weblate (Polish)

Currently translated at 91.6% (254 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index dd24de57..af3f5ccd 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Wysyłanie",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "activeUser": "Active devices",
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From ecccab9ebffc52eb73f8c544acaba6d629e0c8c9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:53 +0000
Subject: [PATCH 212/347] Translated using Weblate (Swedish)

Currently translated at 46.9% (130 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 9458adfe..82255f2e 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 406267146660824f3949d3d686d9aef3df45bc03 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:54 +0000
Subject: [PATCH 213/347] Translated using Weblate (Croatian)

Currently translated at 91.6% (254 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 9301e3ec..87f71bda 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Prijenos",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From b4ca67190240cb11ac44a9a7191950eefd592d85 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:55 +0000
Subject: [PATCH 214/347] Translated using Weblate (Hungarian)

Currently translated at 38.9% (108 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index bb0993ef..92aff4fc 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -351,7 +351,6 @@
         "leech": "Leech"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "connectedAp": "Connected APs",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 207bd04489213cbf537d5ba8df5943fd640d8f01 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:54 +0000
Subject: [PATCH 215/347] Translated using Weblate (Hebrew)

Currently translated at 36.4% (101 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 20d489ee..37a4c601 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From bf1b874368fba5fc3c0ddf6a969709b508d95ccc Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:55 +0000
Subject: [PATCH 216/347] Translated using Weblate (Romanian)

Currently translated at 49.4% (137 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index abe6d5fc..2e90c111 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 0c8fe35af1a3860d10728ea3f79eeeb72da19a8c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:56 +0000
Subject: [PATCH 217/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 42.2% (117 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index a146cb10..6a7919df 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 40657049a665d870124b9062f1bcf2d0fe3a35d4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:54 +0000
Subject: [PATCH 218/347] Translated using Weblate (Yue)

Currently translated at 42.5% (118 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 4d07768c..3bf3652c 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 4c646c660be1f372d5af83c3a3b32cbbc684dda4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:57 +0000
Subject: [PATCH 219/347] Translated using Weblate (Finnish)

Currently translated at 44.4% (123 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 571b4017..f98179cd 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -351,7 +351,6 @@
         "download": "Download"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedSwitches": "Connected switches",
         "connectedGateway": "Connected gateways"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 1452d846e48cb7f8f9fdc5a9731b58428abc8c79 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:57 +0000
Subject: [PATCH 220/347] Translated using Weblate (Telugu)

Currently translated at 78.3% (217 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 3999045e..f135d928 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -351,7 +351,6 @@
         "leech": "Leech"
     },
     "diskstation": {
-        "download": "Download",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 450babf95d7800af0e02c4106a48d1f232579644 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:57 +0000
Subject: [PATCH 221/347] Translated using Weblate (Bulgarian)

Currently translated at 16.6% (46 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 2a46dfcd..ea997138 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "leech": "Leech"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From efa35b4bd47d4c9deaecf795b1a05840f9b3abf5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:55 +0000
Subject: [PATCH 222/347] Translated using Weblate (Turkish)

Currently translated at 83.3% (231 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 0d436900..21f9497a 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From bb422179e5ef9e77c59c045a687bf87efc812bac Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:56 +0000
Subject: [PATCH 223/347] Translated using Weblate (Serbian)

Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index d4f9cc5c..338ff27b 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From b419ddde2d8b4b020b36cdfbfcbd437eb8efd9a6 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:55 +0000
Subject: [PATCH 224/347] Translated using Weblate (Arabic)

Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index 02e65184..c5d20fcc 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "seed": "Seed",
         "upload": "Upload"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From a834d2a4e4aaa780a252907732c401075a09aafd Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:58 +0000
Subject: [PATCH 225/347] Translated using Weblate (Czech)

Currently translated at 81.2% (225 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 58ae8f6b..7fe7b910 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -351,7 +351,6 @@
         "download": "Download"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 953ade7506e3bc28a96f1bf58146934ec195e6b3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:58 +0000
Subject: [PATCH 226/347] Translated using Weblate (Danish)

Currently translated at 71.4% (198 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 41e70f5a..4a7465f4 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 817e5b630ed097f4f7346b82bd13d545fcf60a08 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:47:00 +0000
Subject: [PATCH 227/347] Translated using Weblate (Malay)

Currently translated at 91.3% (253 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 1394876f..5d6525d7 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "download": "Download",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 3249e03bf63c8221821c37571cfaf33b3f4a365b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:56 +0000
Subject: [PATCH 228/347] Translated using Weblate (Hindi)

Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index d5529fd5..8ba69571 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -351,7 +351,6 @@
         "seed": "Seed"
     },
     "diskstation": {
-        "upload": "Upload",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 17e7d449b0ab0d38cfe6fcf10079e25958d5a618 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 16:46:56 +0000
Subject: [PATCH 229/347] Translated using Weblate (Esperanto)

Currently translated at 37.1% (103 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index 3802774e..b12490d5 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -351,7 +351,6 @@
         "total": "Totalo"
     },
     "diskstation": {
-        "leech": "Leech",
         "seed": "Seed"
     },
     "flood": {
@@ -384,5 +383,11 @@
         "alerts": "Alerts",
         "connectedGateway": "Connected gateways",
         "connectedSwitches": "Connected switches"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
     }
 }

From 38d81b654e7e238c4d2a7f5335328c0eed8a95d9 Mon Sep 17 00:00:00 2001
From: Benoit SERRA <oupsman@oupsman.fr>
Date: Fri, 23 Dec 2022 18:12:06 +0100
Subject: [PATCH 230/347] Mikrotik widget (#720)

---
 .gitignore                         |  5 ++++
 public/locales/en/common.json      |  8 +++++-
 src/widgets/components.js          |  1 +
 src/widgets/mikrotik/component.jsx | 43 ++++++++++++++++++++++++++++++
 src/widgets/mikrotik/widget.js     | 24 +++++++++++++++++
 src/widgets/widgets.js             |  2 ++
 6 files changed, 82 insertions(+), 1 deletion(-)
 create mode 100644 src/widgets/mikrotik/component.jsx
 create mode 100644 src/widgets/mikrotik/widget.js

diff --git a/.gitignore b/.gitignore
index 7ab221f9..5649354a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,3 +41,8 @@ next-env.d.ts
 
 # homepage
 /config
+
+# IDEs
+/.idea/
+
+
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index d8a4d383..a1f9df9c 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -206,7 +206,7 @@
         "processed": "Processed",
         "errored": "Errored",
         "saved": "Saved"
-    },     
+    },
     "traefik": {
         "routers": "Routers",
         "services": "Services",
@@ -395,5 +395,11 @@
     "nextdns": {
         "wait": "Please Wait",
         "no_devices": "No Device Data Received"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 6468e841..a2a26332 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -22,6 +22,7 @@ const components = {
   lidarr: dynamic(() => import("./lidarr/component")),
   mastodon: dynamic(() => import("./mastodon/component")),
   miniflux: dynamic(() => import("./miniflux/component")),
+  mikrotik: dynamic(() => import("./mikrotik/component")),
   navidrome: dynamic(() => import("./navidrome/component")),
   nextdns: dynamic(() => import("./nextdns/component")),
   npm: dynamic(() => import("./npm/component")),
diff --git a/src/widgets/mikrotik/component.jsx b/src/widgets/mikrotik/component.jsx
new file mode 100644
index 00000000..37a8f706
--- /dev/null
+++ b/src/widgets/mikrotik/component.jsx
@@ -0,0 +1,43 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: statsData, error: statsError } = useWidgetAPI(widget, "system");
+  const { data: leasesData, error: leasesError } = useWidgetAPI(widget, "leases");
+
+  if (statsError || leasesError) {
+    const finalError = statsError ?? leasesError;
+    return <Container error={ finalError } />;
+  }
+
+  if (!statsData || !leasesData) {
+    return (
+      <Container service={service}>
+        <Block label="mikrotik.uptime" />
+        <Block label="mikrotik.cpuLoad" />
+        <Block label="mikrotik.memoryUsed" />
+        <Block label="mikrotik.numberOfLeases" />
+      </Container>
+    );
+  }
+
+  const memoryUsed = 100 - (statsData['free-memory'] / statsData['total-memory'])*100
+
+  const numberOfLeases = leasesData.length
+
+  return (
+    <Container service={service}>
+      <Block label="mikrotik.uptime" value={ statsData.uptime } />
+      <Block label="mikrotik.cpuLoad" value={t("common.percent", { value: statsData['cpu-load'] })} />
+      <Block label="mikrotik.memoryUsed" value={t("common.percent", { value: memoryUsed })} />
+      <Block label="mikrotik.numberOfLeases" value={t("common.number", { value: numberOfLeases })} />
+    </Container>
+  );
+}
diff --git a/src/widgets/mikrotik/widget.js b/src/widgets/mikrotik/widget.js
new file mode 100644
index 00000000..dfb5f626
--- /dev/null
+++ b/src/widgets/mikrotik/widget.js
@@ -0,0 +1,24 @@
+
+import genericProxyHandler from "utils/proxy/handlers/generic";
+
+const widget = {
+  api: "{url}/rest/{endpoint}",
+  proxyHandler: genericProxyHandler,
+
+  mappings: {
+    system: {
+      endpoint: "system/resource",
+      validate: [
+        "cpu-load",
+        "free-memory",
+        "total-memory",
+        "uptime"
+      ]
+    },
+    leases: {
+      endpoint: "ip/dhcp-server/lease",
+    }
+  },
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index ab5f8bba..523ba9c2 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -17,6 +17,7 @@ import jellyseerr from "./jellyseerr/widget";
 import lidarr from "./lidarr/widget";
 import mastodon from "./mastodon/widget";
 import miniflux from "./miniflux/widget";
+import mikrotik from "./mikrotik/widget";
 import navidrome from "./navidrome/widget";
 import nextdns from "./nextdns/widget";
 import npm from "./npm/widget";
@@ -71,6 +72,7 @@ const widgets = {
   lidarr,
   mastodon,
   miniflux,
+  mikrotik,
   navidrome,
   nextdns,
   npm,

From 31fec3cead6f4e54b6d75d646ea941cbb6d6a2ea Mon Sep 17 00:00:00 2001
From: Hosted Weblate <hosted@weblate.org>
Date: Fri, 23 Dec 2022 18:12:11 +0100
Subject: [PATCH 231/347] Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
---
 public/locales/ar/common.json      | 3 ---
 public/locales/bg/common.json      | 3 ---
 public/locales/ca/common.json      | 3 ---
 public/locales/cs/common.json      | 3 ---
 public/locales/da/common.json      | 3 ---
 public/locales/de/common.json      | 3 ---
 public/locales/eo/common.json      | 3 ---
 public/locales/es/common.json      | 3 ---
 public/locales/fi/common.json      | 3 ---
 public/locales/fr/common.json      | 3 ---
 public/locales/he/common.json      | 3 ---
 public/locales/hi/common.json      | 3 ---
 public/locales/hr/common.json      | 3 ---
 public/locales/hu/common.json      | 3 ---
 public/locales/it/common.json      | 3 ---
 public/locales/ms/common.json      | 3 ---
 public/locales/nb-NO/common.json   | 3 ---
 public/locales/nl/common.json      | 3 ---
 public/locales/pl/common.json      | 3 ---
 public/locales/pt-BR/common.json   | 3 ---
 public/locales/pt/common.json      | 3 ---
 public/locales/ro/common.json      | 3 ---
 public/locales/ru/common.json      | 3 ---
 public/locales/sr/common.json      | 3 ---
 public/locales/sv/common.json      | 3 ---
 public/locales/te/common.json      | 3 ---
 public/locales/tr/common.json      | 3 ---
 public/locales/vi/common.json      | 3 ---
 public/locales/yue/common.json     | 3 ---
 public/locales/zh-CN/common.json   | 3 ---
 public/locales/zh-Hant/common.json | 3 ---
 31 files changed, 93 deletions(-)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index c5d20fcc..c817bcd3 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "upload": "Upload"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index ea997138..376a8e08 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "leech": "Leech"
-    },
     "flood": {
         "leech": "Leech",
         "seed": "Seed",
diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index b202a699..20251bbd 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -350,9 +350,6 @@
         "upload": "Pujada",
         "leech": "Company"
     },
-    "diskstation": {
-        "seed": "Llavor"
-    },
     "flood": {
         "download": "Descarregar",
         "upload": "Pujada",
diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 7fe7b910..22a822e5 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -350,9 +350,6 @@
         "seed": "Seed",
         "download": "Download"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 4a7465f4..56f95325 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "leech": "Leech",
         "download": "Download",
diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index cfc7b19d..445174dc 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index b12490d5..6a1a3d2a 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -350,9 +350,6 @@
         "inbox": "Inbox",
         "total": "Totalo"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 9af87af9..9f812887 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Semilla"
     },
-    "diskstation": {
-        "seed": "Semilla"
-    },
     "flood": {
         "download": "Descargar",
         "upload": "Subir",
diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index f98179cd..51f7e343 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -350,9 +350,6 @@
         "seed": "Seed",
         "download": "Download"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index ca058bec..983a8774 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Récep.",
         "upload": "Envoi",
diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 37a4c601..a681fec8 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 8ba69571..0e7ced70 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 87f71bda..99eaa4ae 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Preuzimanje",
         "upload": "Prijenos",
diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 92aff4fc..bd2be55c 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -350,9 +350,6 @@
         "upload": "Upload",
         "leech": "Leech"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 1fc7eac4..a84c5a2b 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 5d6525d7..13b23b88 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 3cae63da..6c749737 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -350,9 +350,6 @@
         "upload": "Upload",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index c4698aa7..e70bd7e7 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index af3f5ccd..53ac88f7 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Pobieranie",
         "upload": "Wysyłanie",
diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 6a7919df..871942ef 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index d3ecf7d4..9c8435ce 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -363,9 +363,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Descarregar",
         "upload": "Carregar",
diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 2e90c111..3add90d1 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index ebd447cf..96a6da1d 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "leech": "Leech"
-    },
     "flood": {
         "upload": "Upload",
         "download": "Download",
diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 338ff27b..8081d7c4 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "seed": "Seed",
diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 82255f2e..0f574d1a 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -350,9 +350,6 @@
         "upload": "Upload",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index f135d928..b364d5af 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -350,9 +350,6 @@
         "upload": "Upload",
         "leech": "Leech"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 21f9497a..088bce8c 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index 3abc6512..f8e8e79e 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 3bf3652c..edf17b40 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",
diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index 218d35e6..e7bc9369 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "leech": "Leech",
         "download": "Download",
diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index edadf493..28bb2096 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -350,9 +350,6 @@
         "leech": "Leech",
         "seed": "Seed"
     },
-    "diskstation": {
-        "seed": "Seed"
-    },
     "flood": {
         "download": "Download",
         "upload": "Upload",

From e9610f7c34f35d06950350ec87fb500a6510d4d6 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:26 +0000
Subject: [PATCH 232/347] Translated using Weblate (German)

Currently translated at 81.1% (228 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 445174dc..b0a67d8e 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From cbded542f99168fd12a6720195066e17a7a7e8c1 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:26 +0000
Subject: [PATCH 233/347] Translated using Weblate (Spanish)

Currently translated at 97.1% (273 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 9f812887..c2727026 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 3b0e2797ca7380438c8d7b492bb206b688d2228d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:27 +0000
Subject: [PATCH 234/347] Translated using Weblate (French)

Currently translated at 97.1% (273 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 983a8774..4b78d108 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 667b88a450ae57361f0d9123e485f9ddc37090bb Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:27 +0000
Subject: [PATCH 235/347] Translated using Weblate (Portuguese)

Currently translated at 58.3% (164 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 9c8435ce..6b41a411 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -395,5 +395,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From f363f90da57e7da0daecd10c099cf4713238b2e3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:27 +0000
Subject: [PATCH 236/347] Translated using Weblate (Russian)

Currently translated at 17.0% (48 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 96a6da1d..7b0d512d 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 195ebf20676ba34a5c09a9e4c81941ef06b10071 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:27 +0000
Subject: [PATCH 237/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 59.7% (168 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index e7bc9369..cc05eecf 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 922df3288b5c17c18cb99023cf406a2c8cf00ae7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:28 +0000
Subject: [PATCH 238/347] Translated using Weblate (Italian)

Currently translated at 95.3% (268 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index a84c5a2b..3f531e4a 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 644014419cc0115b2323640159a52d8be7a8dfe0 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:26 +0000
Subject: [PATCH 239/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 28.1% (79 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 6c749737..069bb58a 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases",
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used"
     }
 }

From cf4c8885a1ee214c7bcafffb8f20080897914f2d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:28 +0000
Subject: [PATCH 240/347] Translated using Weblate (Vietnamese)

Currently translated at 15.6% (44 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index f8e8e79e..eff1581b 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases",
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used"
     }
 }

From 7602ec8479c60919ac9cf07f4b78e53d25cb71ca Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:28 +0000
Subject: [PATCH 241/347] Translated using Weblate (Dutch)

Currently translated at 22.4% (63 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index e70bd7e7..39d9854f 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From ca6065d42849f3c007e66986d00d00621f399d60 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:29 +0000
Subject: [PATCH 242/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.2% (9 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 28bb2096..a66e55a2 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From f5f6c57ba8b5133956f3043e735d5e7a0eaa278c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:22 +0000
Subject: [PATCH 243/347] Translated using Weblate (Catalan)

Currently translated at 91.8% (258 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 20251bbd..eee5828c 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From ae781a942e95bfd31a41a0ab70f993a59d4b7bfd Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:24 +0000
Subject: [PATCH 244/347] Translated using Weblate (Polish)

Currently translated at 90.3% (254 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index 53ac88f7..d51e5a1c 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 1662302b134ea6246aa0455b3c7e8014fb7140f8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:20 +0000
Subject: [PATCH 245/347] Translated using Weblate (Swedish)

Currently translated at 46.2% (130 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 0f574d1a..55411e9d 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From b0b5d8b381c83465ad458729e7b317d213de762d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:20 +0000
Subject: [PATCH 246/347] Translated using Weblate (Croatian)

Currently translated at 90.3% (254 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 99eaa4ae..828f8ed1 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From d69dda762abad24fd7bb4dbd39c3334532fe76c8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:22 +0000
Subject: [PATCH 247/347] Translated using Weblate (Hungarian)

Currently translated at 38.4% (108 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index bd2be55c..8eb18b02 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 8dff267305640d3417cc967996f76cf9c5c3fefc Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:21 +0000
Subject: [PATCH 248/347] Translated using Weblate (Hebrew)

Currently translated at 35.9% (101 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index a681fec8..a0bd66f9 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 4c658cf717e87699da7a7a62c3476239c68c8175 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:22 +0000
Subject: [PATCH 249/347] Translated using Weblate (Romanian)

Currently translated at 48.7% (137 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 3add90d1..5328837f 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "numberOfLeases": "Leases",
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime"
     }
 }

From 458d376ce50c4258144173b13cd013348220b425 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:23 +0000
Subject: [PATCH 250/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 41.6% (117 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 871942ef..0ce1cc1d 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From a8084e9e80c4e26dc4f423e399f68ad95d6e1a3b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:21 +0000
Subject: [PATCH 251/347] Translated using Weblate (Yue)

Currently translated at 41.9% (118 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index edf17b40..8791c97f 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From d650d1cae5d35f5ab1ea19379b5ddcea7d4808dc Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:25 +0000
Subject: [PATCH 252/347] Translated using Weblate (Finnish)

Currently translated at 43.7% (123 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 51f7e343..f52627d6 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 6722c3712d1544b1f2ddeab20718c6444da2cb68 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:24 +0000
Subject: [PATCH 253/347] Translated using Weblate (Telugu)

Currently translated at 77.2% (217 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index b364d5af..b988642d 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases",
+        "memoryUsed": "Memory Used"
     }
 }

From b4602a2e4bdcf01abc79586754d693bd4f30fda0 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:25 +0000
Subject: [PATCH 254/347] Translated using Weblate (Bulgarian)

Currently translated at 16.3% (46 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 376a8e08..5a01d758 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 789831ff57f72195ec288f874ca7065ad52b194e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:22 +0000
Subject: [PATCH 255/347] Translated using Weblate (Turkish)

Currently translated at 82.2% (231 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 088bce8c..08a9992e 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 4ff2799c0ec40f88861a1bf97429eaf4eab3b3a7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:24 +0000
Subject: [PATCH 256/347] Translated using Weblate (Serbian)

Currently translated at 3.2% (9 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 8081d7c4..230033c3 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 59e966c6dd9e52e836a579499538d72330723216 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:23 +0000
Subject: [PATCH 257/347] Translated using Weblate (Arabic)

Currently translated at 15.6% (44 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index c817bcd3..c1610adc 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 5a8ae8a62690a95b458e6c147659672b1a793f18 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:26 +0000
Subject: [PATCH 258/347] Translated using Weblate (Czech)

Currently translated at 80.0% (225 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 22a822e5..9487646d 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From b1a0b4ebcf87d65349f737c3268f125ff661d97e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:25 +0000
Subject: [PATCH 259/347] Translated using Weblate (Danish)

Currently translated at 70.4% (198 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 56f95325..72e366b2 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 2b41121a800268415ed173dff936a6a306da44e6 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:28 +0000
Subject: [PATCH 260/347] Translated using Weblate (Malay)

Currently translated at 90.0% (253 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 13b23b88..0da9b6d3 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 4417161e0cee7ea5ff10d430ac31547613a9c94c Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:23 +0000
Subject: [PATCH 261/347] Translated using Weblate (Hindi)

Currently translated at 3.2% (9 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 0e7ced70..e2a7dcca 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 82c290d5d818ab33764642f633c10308a4f55999 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Fri, 23 Dec 2022 17:12:24 +0000
Subject: [PATCH 262/347] Translated using Weblate (Esperanto)

Currently translated at 36.6% (103 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index 6a1a3d2a..e0b1e3d8 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -386,5 +386,11 @@
         "upload": "Upload",
         "leech": "Leech",
         "seed": "Seed"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
     }
 }

From 4017997448ff736337e47e49290c8b9f05bad037 Mon Sep 17 00:00:00 2001
From: gallegonovato <fran-carro@hotmail.es>
Date: Sat, 24 Dec 2022 12:52:49 +0000
Subject: [PATCH 263/347] Translated using Weblate (Spanish)

Currently translated at 100.0% (281 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index c2727026..539e173c 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -382,15 +382,15 @@
         "connectedSwitches": "Interruptores conectados"
     },
     "downloadstation": {
-        "download": "Download",
-        "upload": "Upload",
-        "leech": "Leech",
-        "seed": "Seed"
+        "download": "Descargar",
+        "upload": "Subir",
+        "leech": "Sanguijuela",
+        "seed": "Semilla"
     },
     "mikrotik": {
-        "cpuLoad": "CPU Load",
-        "memoryUsed": "Memory Used",
-        "uptime": "Uptime",
-        "numberOfLeases": "Leases"
+        "cpuLoad": "Carga de la CPU",
+        "memoryUsed": "Memoria utilizada",
+        "uptime": "Tiempo en funcionamiento",
+        "numberOfLeases": "Alquileres"
     }
 }

From 6f34aaefa4f94c475ebe03284c197a946648b6a1 Mon Sep 17 00:00:00 2001
From: Nonoss117 <nonoss117@gmail.com>
Date: Fri, 23 Dec 2022 18:53:54 +0000
Subject: [PATCH 264/347] Translated using Weblate (French)

Currently translated at 100.0% (281 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 4b78d108..e34fd67b 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -382,15 +382,15 @@
         "connectedSwitches": "Switches connectés"
     },
     "downloadstation": {
-        "download": "Download",
-        "upload": "Upload",
+        "download": "Récep.",
+        "upload": "Envoi",
         "leech": "Leech",
         "seed": "Seed"
     },
     "mikrotik": {
-        "cpuLoad": "CPU Load",
-        "memoryUsed": "Memory Used",
-        "uptime": "Uptime",
-        "numberOfLeases": "Leases"
+        "cpuLoad": "Charge CPU",
+        "memoryUsed": "Mém. Utilisée",
+        "uptime": "Disponibilité",
+        "numberOfLeases": "Baux"
     }
 }

From 8bdd03a63280f72a31da0a8e2b9e94826fce58ae Mon Sep 17 00:00:00 2001
From: Paolo Casellati <ca.paolo97@gmail.com>
Date: Sat, 24 Dec 2022 16:10:45 +0000
Subject: [PATCH 265/347] Translated using Weblate (Italian)

Currently translated at 99.6% (280 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 3f531e4a..6bf614b1 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -375,11 +375,11 @@
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     },
     "omada": {
-        "connectedAp": "Connected APs",
-        "activeUser": "Active devices",
-        "alerts": "Alerts",
-        "connectedGateway": "Connected gateways",
-        "connectedSwitches": "Connected switches"
+        "connectedAp": "AP Connessi",
+        "activeUser": "Dispositivi attivi",
+        "alerts": "Allarmi",
+        "connectedGateway": "Gateway connessi",
+        "connectedSwitches": "Switch connessi"
     },
     "downloadstation": {
         "download": "Download",
@@ -388,9 +388,9 @@
         "seed": "Seed"
     },
     "mikrotik": {
-        "cpuLoad": "CPU Load",
-        "memoryUsed": "Memory Used",
-        "uptime": "Uptime",
+        "cpuLoad": "Carico della CPU",
+        "memoryUsed": "Memoria Utilizzata",
+        "uptime": "Tempo di attività",
         "numberOfLeases": "Leases"
     }
 }

From 977c65f911e3fcf2203f3953eb569389ea129456 Mon Sep 17 00:00:00 2001
From: retmas-gh <github@oppai.ovh>
Date: Fri, 23 Dec 2022 21:08:41 +0000
Subject: [PATCH 266/347] Translated using Weblate (Polish)

Currently translated at 97.8% (275 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 38 +++++++++++++++++------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index d51e5a1c..209db63a 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -357,40 +357,40 @@
         "seed": "Seed"
     },
     "tdarr": {
-        "queue": "Queue",
-        "processed": "Processed",
-        "errored": "Errored",
-        "saved": "Saved"
+        "queue": "Kolejka",
+        "processed": "Przetworzone",
+        "errored": "Błędne",
+        "saved": "Zapisane"
     },
     "miniflux": {
-        "read": "Read",
-        "unread": "Unread"
+        "read": "Przeczytane",
+        "unread": "Nieprzeczytane"
     },
     "nextdns": {
-        "wait": "Please Wait",
-        "no_devices": "No Device Data Received"
+        "wait": "Proszę czekać",
+        "no_devices": "Nie otrzymano danych urządzenia"
     },
     "common": {
         "bibyterate": "{{value, rate(bits: false; binary: true)}}",
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     },
     "omada": {
-        "connectedSwitches": "Connected switches",
-        "connectedAp": "Connected APs",
-        "activeUser": "Active devices",
-        "alerts": "Alerts",
-        "connectedGateway": "Connected gateways"
+        "connectedSwitches": "Połączone przełączniki",
+        "connectedAp": "Połączone punkty dostępowe",
+        "activeUser": "Aktywne urządzenia",
+        "alerts": "Alarmy",
+        "connectedGateway": "Połączone bramy"
     },
     "downloadstation": {
-        "download": "Download",
-        "upload": "Upload",
+        "download": "Pobieranie",
+        "upload": "Wysyłanie",
         "leech": "Leech",
         "seed": "Seed"
     },
     "mikrotik": {
-        "cpuLoad": "CPU Load",
-        "memoryUsed": "Memory Used",
-        "uptime": "Uptime",
-        "numberOfLeases": "Leases"
+        "cpuLoad": "Obciążenie procesora",
+        "memoryUsed": "Zuyżyta pamięć",
+        "uptime": "Czas działania",
+        "numberOfLeases": "Dzierżawy"
     }
 }

From 54fb2018744f5ab6fc34e074e6e133854f75f34b Mon Sep 17 00:00:00 2001
From: Dan <denqwerta@gmail.com>
Date: Sun, 25 Dec 2022 23:02:49 +0100
Subject: [PATCH 267/347] Added translation using Weblate (Ukrainian)

---
 public/locales/uk/common.json | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 public/locales/uk/common.json

diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/public/locales/uk/common.json
@@ -0,0 +1 @@
+{}

From 3a27486c34747e951cdc23ad9ccf27357ca527c9 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Sun, 25 Dec 2022 22:02:52 +0000
Subject: [PATCH 268/347] Translated using Weblate (Ukrainian)

Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
---
 public/locales/uk/common.json | 397 +++++++++++++++++++++++++++++++++-
 1 file changed, 396 insertions(+), 1 deletion(-)

diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json
index 0967ef42..a09497f1 100644
--- a/public/locales/uk/common.json
+++ b/public/locales/uk/common.json
@@ -1 +1,396 @@
-{}
+{
+    "common": {
+        "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+        "bibitrate": "{{value, rate(bits: true; binary: true)}}"
+    },
+    "omada": {
+        "alerts": "Alerts",
+        "connectedGateway": "Connected gateways",
+        "connectedSwitches": "Connected switches",
+        "connectedAp": "Connected APs",
+        "activeUser": "Active devices"
+    },
+    "sabnzbd": {
+        "rate": "Rate",
+        "queue": "Queue",
+        "timeleft": "Time Left"
+    },
+    "rutorrent": {
+        "active": "Active",
+        "upload": "Upload",
+        "download": "Download"
+    },
+    "deluge": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
+    },
+    "readarr": {
+        "wanted": "Wanted",
+        "queued": "Queued",
+        "books": "Books"
+    },
+    "wmo": {
+        "55-day": "Heavy Drizzle",
+        "55-night": "Heavy Drizzle",
+        "56-day": "Light Freezing Drizzle",
+        "56-night": "Light Freezing Drizzle",
+        "0-day": "Sunny",
+        "0-night": "Clear",
+        "1-day": "Mainly Sunny",
+        "1-night": "Mainly Clear",
+        "2-day": "Partly Cloudy",
+        "2-night": "Partly Cloudy",
+        "3-day": "Cloudy",
+        "3-night": "Cloudy",
+        "53-day": "Drizzle",
+        "45-day": "Foggy",
+        "45-night": "Foggy",
+        "48-day": "Foggy",
+        "48-night": "Foggy",
+        "51-day": "Light Drizzle",
+        "51-night": "Light Drizzle",
+        "53-night": "Drizzle",
+        "57-day": "Freezing Drizzle",
+        "57-night": "Freezing Drizzle",
+        "61-day": "Light Rain",
+        "61-night": "Light Rain",
+        "63-day": "Rain",
+        "63-night": "Rain",
+        "65-day": "Heavy Rain",
+        "65-night": "Heavy Rain",
+        "66-day": "Freezing Rain",
+        "66-night": "Freezing Rain",
+        "67-day": "Freezing Rain",
+        "67-night": "Freezing Rain",
+        "71-day": "Light Snow",
+        "71-night": "Light Snow",
+        "73-day": "Snow",
+        "73-night": "Snow",
+        "75-day": "Heavy Snow",
+        "75-night": "Heavy Snow",
+        "77-day": "Snow Grains",
+        "77-night": "Snow Grains",
+        "80-day": "Light Showers",
+        "80-night": "Light Showers",
+        "81-day": "Showers",
+        "82-day": "Heavy Showers",
+        "82-night": "Heavy Showers",
+        "81-night": "Showers",
+        "85-day": "Snow Showers",
+        "85-night": "Snow Showers",
+        "86-day": "Snow Showers",
+        "86-night": "Snow Showers",
+        "95-day": "Thunderstorm",
+        "95-night": "Thunderstorm",
+        "96-day": "Thunderstorm With Hail",
+        "96-night": "Thunderstorm With Hail",
+        "99-day": "Thunderstorm With Hail",
+        "99-night": "Thunderstorm With Hail"
+    },
+    "pyload": {
+        "speed": "Speed",
+        "active": "Active",
+        "queue": "Queue",
+        "total": "Total"
+    },
+    "gluetun": {
+        "country": "Country",
+        "public_ip": "Public IP",
+        "region": "Region"
+    },
+    "hdhomerun": {
+        "channels": "Channels",
+        "hd": "HD"
+    },
+    "widget": {
+        "missing_type": "Missing Widget Type: {{type}}",
+        "api_error": "API Error",
+        "information": "Information",
+        "status": "Status",
+        "url": "URL",
+        "raw_error": "Raw Error",
+        "response_data": "Response Data"
+    },
+    "weather": {
+        "current": "Current Location",
+        "allow": "Click to allow",
+        "updating": "Updating",
+        "wait": "Please wait"
+    },
+    "search": {
+        "placeholder": "Search…"
+    },
+    "resources": {
+        "cpu": "CPU",
+        "total": "Total",
+        "free": "Free",
+        "used": "Used",
+        "load": "Load"
+    },
+    "unifi": {
+        "users": "Users",
+        "uptime": "System Uptime",
+        "days": "Days",
+        "wan": "WAN",
+        "lan": "LAN",
+        "wlan": "WLAN",
+        "devices": "Devices",
+        "lan_devices": "LAN Devices",
+        "wlan_devices": "WLAN Devices",
+        "lan_users": "LAN Users",
+        "wlan_users": "WLAN Users",
+        "up": "UP",
+        "down": "DOWN",
+        "wait": "Please wait"
+    },
+    "docker": {
+        "rx": "RX",
+        "tx": "TX",
+        "mem": "MEM",
+        "cpu": "CPU",
+        "offline": "Offline",
+        "error": "Error",
+        "unknown": "Unknown"
+    },
+    "ping": {
+        "error": "Error",
+        "ping": "Ping"
+    },
+    "emby": {
+        "playing": "Playing",
+        "transcoding": "Transcoding",
+        "bitrate": "Bitrate",
+        "no_active": "No Active Streams"
+    },
+    "flood": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
+    },
+    "changedetectionio": {
+        "totalObserved": "Total Observed",
+        "diffsDetected": "Diffs Detected"
+    },
+    "tautulli": {
+        "playing": "Playing",
+        "transcoding": "Transcoding",
+        "bitrate": "Bitrate",
+        "no_active": "No Active Streams"
+    },
+    "nzbget": {
+        "rate": "Rate",
+        "downloaded": "Downloaded",
+        "remaining": "Remaining"
+    },
+    "plex": {
+        "streams": "Active Streams",
+        "movies": "Movies",
+        "tv": "TV Shows"
+    },
+    "transmission": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
+    },
+    "qbittorrent": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
+    },
+    "downloadstation": {
+        "download": "Download",
+        "upload": "Upload",
+        "leech": "Leech",
+        "seed": "Seed"
+    },
+    "sonarr": {
+        "wanted": "Wanted",
+        "queued": "Queued",
+        "series": "Series"
+    },
+    "radarr": {
+        "wanted": "Wanted",
+        "missing": "Missing",
+        "queued": "Queued",
+        "movies": "Movies"
+    },
+    "lidarr": {
+        "wanted": "Wanted",
+        "queued": "Queued",
+        "albums": "Albums"
+    },
+    "traefik": {
+        "middleware": "Middleware",
+        "routers": "Routers",
+        "services": "Services"
+    },
+    "navidrome": {
+        "nothing_streaming": "No Active Streams",
+        "please_wait": "Please Wait"
+    },
+    "bazarr": {
+        "missingEpisodes": "Missing Episodes",
+        "missingMovies": "Missing Movies"
+    },
+    "ombi": {
+        "pending": "Pending",
+        "approved": "Approved",
+        "available": "Available"
+    },
+    "jellyseerr": {
+        "pending": "Pending",
+        "approved": "Approved",
+        "available": "Available"
+    },
+    "overseerr": {
+        "pending": "Pending",
+        "processing": "Processing",
+        "approved": "Approved",
+        "available": "Available"
+    },
+    "pihole": {
+        "queries": "Queries",
+        "blocked": "Blocked",
+        "gravity": "Gravity"
+    },
+    "adguard": {
+        "queries": "Queries",
+        "blocked": "Blocked",
+        "filtered": "Filtered",
+        "latency": "Latency"
+    },
+    "speedtest": {
+        "upload": "Upload",
+        "download": "Download",
+        "ping": "Ping"
+    },
+    "portainer": {
+        "running": "Running",
+        "stopped": "Stopped",
+        "total": "Total"
+    },
+    "tdarr": {
+        "queue": "Queue",
+        "processed": "Processed",
+        "errored": "Errored",
+        "saved": "Saved"
+    },
+    "npm": {
+        "enabled": "Enabled",
+        "disabled": "Disabled",
+        "total": "Total"
+    },
+    "coinmarketcap": {
+        "configure": "Configure one or more crypto currencies to track",
+        "1hour": "1 Hour",
+        "1day": "1 Day",
+        "7days": "7 Days",
+        "30days": "30 Days"
+    },
+    "mastodon": {
+        "domain_count": "Domains",
+        "user_count": "Users",
+        "status_count": "Posts"
+    },
+    "miniflux": {
+        "read": "Read",
+        "unread": "Unread"
+    },
+    "gotify": {
+        "apps": "Applications",
+        "clients": "Clients",
+        "messages": "Messages"
+    },
+    "prowlarr": {
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
+    },
+    "jackett": {
+        "configured": "Configured",
+        "errored": "Errored"
+    },
+    "strelaysrv": {
+        "numActiveSessions": "Sessions",
+        "numConnections": "Connections",
+        "dataRelayed": "Relayed",
+        "transferRate": "Rate"
+    },
+    "authentik": {
+        "users": "Users",
+        "loginsLast24H": "Logins (24h)",
+        "failedLoginsLast24H": "Failed Logins (24h)"
+    },
+    "proxmox": {
+        "mem": "MEM",
+        "cpu": "CPU",
+        "vms": "VMs",
+        "lxc": "LXC"
+    },
+    "glances": {
+        "cpu": "CPU",
+        "mem": "MEM",
+        "wait": "Please wait"
+    },
+    "quicklaunch": {
+        "bookmark": "Bookmark",
+        "service": "Service"
+    },
+    "homebridge": {
+        "available_update": "System",
+        "updates": "Updates",
+        "child_bridges_status": "{{ok}}/{{total}}",
+        "update_available": "Update Available",
+        "up_to_date": "Up to Date",
+        "child_bridges": "Child Bridges"
+    },
+    "watchtower": {
+        "containers_scanned": "Scanned",
+        "containers_updated": "Updated",
+        "containers_failed": "Failed"
+    },
+    "autobrr": {
+        "approvedPushes": "Approved",
+        "rejectedPushes": "Rejected",
+        "filters": "Filters",
+        "indexers": "Indexers"
+    },
+    "tubearchivist": {
+        "downloads": "Queue",
+        "videos": "Videos",
+        "channels": "Channels",
+        "playlists": "Playlists"
+    },
+    "truenas": {
+        "load": "System Load",
+        "uptime": "Uptime",
+        "alerts": "Alerts",
+        "time": "{{value, number(style: unit; unitDisplay: long;)}}"
+    },
+    "scrutiny": {
+        "passed": "Passed",
+        "failed": "Failed",
+        "unknown": "Unknown"
+    },
+    "paperlessngx": {
+        "inbox": "Inbox",
+        "total": "Total"
+    },
+    "nextdns": {
+        "wait": "Please Wait",
+        "no_devices": "No Device Data Received"
+    },
+    "mikrotik": {
+        "cpuLoad": "CPU Load",
+        "memoryUsed": "Memory Used",
+        "uptime": "Uptime",
+        "numberOfLeases": "Leases"
+    }
+}

From 43a11eadfc4ad52885a1e70e2e334ccf99a09f4f Mon Sep 17 00:00:00 2001
From: Marcus Kimpenhaus <kimpenhaus@devil-engineering.de>
Date: Mon, 26 Dec 2022 05:51:51 +0100
Subject: [PATCH 269/347] added widget for xteve (#731)

* added xteve widget

* eslint fixes

* xteve code cleanup

Co-authored-by: Marcus Kimpenhaus <k@AirM2.kimpenhaus.net>
Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
---
 public/locales/en/common.json   |  5 +++
 src/widgets/components.js       |  1 +
 src/widgets/widgets.js          |  2 ++
 src/widgets/xteve/component.jsx | 35 +++++++++++++++++++
 src/widgets/xteve/proxy.js      | 62 +++++++++++++++++++++++++++++++++
 src/widgets/xteve/widget.js     | 14 ++++++++
 6 files changed, 119 insertions(+)
 create mode 100644 src/widgets/xteve/component.jsx
 create mode 100644 src/widgets/xteve/proxy.js
 create mode 100644 src/widgets/xteve/widget.js

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index a1f9df9c..8436d28b 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -401,5 +401,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }
diff --git a/src/widgets/components.js b/src/widgets/components.js
index a2a26332..4ee443ac 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -54,6 +54,7 @@ const components = {
   truenas: dynamic(() => import("./truenas/component")),
   unifi: dynamic(() => import("./unifi/component")),
   watchtower: dynamic(() => import("./watchtower/component")),
+  xteve: dynamic(() => import("./xteve/component")),
 };
 
 export default components;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 523ba9c2..0c53b388 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -49,6 +49,7 @@ import tubearchivist from "./tubearchivist/widget";
 import truenas from "./truenas/widget";
 import unifi from "./unifi/widget";
 import watchtower from './watchtower/widget'
+import xteve from './xteve/widget'
 
 const widgets = {
   adguard,
@@ -105,6 +106,7 @@ const widgets = {
   unifi,
   unifi_console: unifi,
   watchtower,
+  xteve,
 };
 
 export default widgets;
diff --git a/src/widgets/xteve/component.jsx b/src/widgets/xteve/component.jsx
new file mode 100644
index 00000000..9d22e8a1
--- /dev/null
+++ b/src/widgets/xteve/component.jsx
@@ -0,0 +1,35 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: xteveData, error: xteveError } = useWidgetAPI(widget, "api");
+
+  if (xteveError) {
+    return <Container error={xteveError} />;
+  }
+
+  if (!xteveData) {
+    return (
+      <Container service={service}>
+        <Block label="xteve.streams_all" />
+        <Block label="xteve.streams_active " />
+        <Block label="xteve.streams_xepg" />
+      </Container>
+    );
+  }
+
+  return (
+    <Container service={service}>
+      <Block label="xteve.streams_all" value={t("common.number", { value: xteveData["streams.all"] ?? 0 })} />
+      <Block label="xteve.streams_active" value={t("common.number", { value: xteveData["streams.active"] ?? 0 })} />
+      <Block label="xteve.streams_xepg" value={t("common.number", { value: xteveData["streams.xepg"] ?? 0 })} />
+    </Container>
+  );
+}
diff --git a/src/widgets/xteve/proxy.js b/src/widgets/xteve/proxy.js
new file mode 100644
index 00000000..22795b76
--- /dev/null
+++ b/src/widgets/xteve/proxy.js
@@ -0,0 +1,62 @@
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
+import createLogger from "utils/logger";
+import widgets from "widgets/widgets";
+import getServiceWidget from "utils/config/service-helpers";
+
+const logger = createLogger("xteveProxyHandler");
+
+export default async function xteveProxyHandler(req, res) {
+  const { group, service, endpoint } = req.query;
+
+  if (!group || !service) {
+    return res.status(400).json({ error: "Invalid proxy service type" });
+  }
+
+  const widget = await getServiceWidget(group, service);
+  const api = widgets?.[widget.type]?.api;
+  if (!api) {
+    return res.status(403).json({ error: "Service does not support API calls" });
+  }
+
+  const url = formatApiCall(api, { endpoint, ...widget });
+  const method = "POST";
+  const payload = { cmd: "status" };
+
+  if (widget.username && widget.password) {
+     const [status, contentType, data] = await httpProxy(url, {
+      method,
+      body: JSON.stringify({
+        cmd: "login",
+        username: widget.username,
+        password: widget.password,
+      })
+    });
+
+    if (status !== 200) {
+      return [status, contentType, data];
+    }
+
+    const json = JSON.parse(data.toString());
+
+    if (json?.status !== true) {
+      const message = "Authentication failed.";
+      return res.status(401).end(JSON.stringify({error: { message } }));
+    }
+
+    payload.token = json.token;
+  }
+
+  const [status, contentType, data] = await httpProxy(url, {
+    method,
+    body: JSON.stringify(payload)
+  });
+
+  if (status !== 200) {
+    logger.debug("Error %d calling endpoint %s", status, url);
+    return res.status(status, data);
+  }
+
+  if (contentType) res.setHeader("Content-Type", contentType);
+  return res.status(status).send(data);
+}
diff --git a/src/widgets/xteve/widget.js b/src/widgets/xteve/widget.js
new file mode 100644
index 00000000..59b6e3fa
--- /dev/null
+++ b/src/widgets/xteve/widget.js
@@ -0,0 +1,14 @@
+import xteveProxyHandler from "./proxy";
+
+const widget = {
+  api: "{url}/{endpoint}",
+  proxyHandler: xteveProxyHandler,
+
+  mappings: {
+    "api": {
+      endpoint: "api/",
+    },
+  },
+};
+
+export default widget;

From 1dd7947c71537655be736a156e3aa164b2d36ecd Mon Sep 17 00:00:00 2001
From: Dan <denqwerta@gmail.com>
Date: Sun, 25 Dec 2022 23:03:49 +0000
Subject: [PATCH 270/347] Translated using Weblate (Ukrainian)

Currently translated at 46.2% (130 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
---
 public/locales/uk/common.json | 226 +++++++++++++++++-----------------
 1 file changed, 113 insertions(+), 113 deletions(-)

diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json
index a09497f1..bfacda99 100644
--- a/public/locales/uk/common.json
+++ b/public/locales/uk/common.json
@@ -4,32 +4,32 @@
         "bibitrate": "{{value, rate(bits: true; binary: true)}}"
     },
     "omada": {
-        "alerts": "Alerts",
-        "connectedGateway": "Connected gateways",
-        "connectedSwitches": "Connected switches",
-        "connectedAp": "Connected APs",
-        "activeUser": "Active devices"
+        "alerts": "Оповіщення",
+        "connectedGateway": "Підключені шлюзи",
+        "connectedSwitches": "Підключені перемикачі",
+        "connectedAp": "Підключені точки доступу",
+        "activeUser": "Активні пристрої"
     },
     "sabnzbd": {
-        "rate": "Rate",
-        "queue": "Queue",
-        "timeleft": "Time Left"
+        "rate": "Швидкість",
+        "queue": "Черга",
+        "timeleft": "Залишилось"
     },
     "rutorrent": {
-        "active": "Active",
-        "upload": "Upload",
-        "download": "Download"
+        "active": "Активний",
+        "upload": "Відправлення",
+        "download": "Завантаження"
     },
     "deluge": {
-        "download": "Download",
-        "upload": "Upload",
+        "download": "Завантаження",
+        "upload": "Відправлення",
         "leech": "Leech",
         "seed": "Seed"
     },
     "readarr": {
-        "wanted": "Wanted",
-        "queued": "Queued",
-        "books": "Books"
+        "wanted": "Розшукується",
+        "queued": "У черзі",
+        "books": "Книжки"
     },
     "wmo": {
         "55-day": "Heavy Drizzle",
@@ -105,180 +105,180 @@
         "hd": "HD"
     },
     "widget": {
-        "missing_type": "Missing Widget Type: {{type}}",
-        "api_error": "API Error",
-        "information": "Information",
-        "status": "Status",
+        "missing_type": "Відсутній тип віджета: {{type}}",
+        "api_error": "Помилка API",
+        "information": "Інформація",
+        "status": "Стан",
         "url": "URL",
-        "raw_error": "Raw Error",
-        "response_data": "Response Data"
+        "raw_error": "Помилка Raw",
+        "response_data": "Дані відповіді"
     },
     "weather": {
-        "current": "Current Location",
-        "allow": "Click to allow",
-        "updating": "Updating",
-        "wait": "Please wait"
+        "current": "Поточне розташування",
+        "allow": "Натисніть, щоб дозволити",
+        "updating": "Оновлення",
+        "wait": "Будь ласка, зачекайте"
     },
     "search": {
-        "placeholder": "Search…"
+        "placeholder": "Пошук…"
     },
     "resources": {
         "cpu": "CPU",
-        "total": "Total",
-        "free": "Free",
-        "used": "Used",
-        "load": "Load"
+        "total": "Всього",
+        "free": "Вільно",
+        "used": "Використано",
+        "load": "Навантаження"
     },
     "unifi": {
-        "users": "Users",
-        "uptime": "System Uptime",
-        "days": "Days",
+        "users": "Користувачі",
+        "uptime": "Час роботи системи",
+        "days": "Днів",
         "wan": "WAN",
         "lan": "LAN",
         "wlan": "WLAN",
-        "devices": "Devices",
-        "lan_devices": "LAN Devices",
-        "wlan_devices": "WLAN Devices",
-        "lan_users": "LAN Users",
-        "wlan_users": "WLAN Users",
-        "up": "UP",
-        "down": "DOWN",
-        "wait": "Please wait"
+        "devices": "Пристрої",
+        "lan_devices": "LAN пристрої",
+        "wlan_devices": "WLAN пристрої",
+        "lan_users": "LAN користувачі",
+        "wlan_users": "WLAN користувачі",
+        "up": "Відправка",
+        "down": "Завантаження",
+        "wait": "Будь ласка, зачекайте"
     },
     "docker": {
         "rx": "RX",
         "tx": "TX",
-        "mem": "MEM",
+        "mem": "Пам'ять",
         "cpu": "CPU",
-        "offline": "Offline",
-        "error": "Error",
-        "unknown": "Unknown"
+        "offline": "Офлайн",
+        "error": "Помилка",
+        "unknown": "Невідомий"
     },
     "ping": {
-        "error": "Error",
-        "ping": "Ping"
+        "error": "Помилка",
+        "ping": "Пінг"
     },
     "emby": {
-        "playing": "Playing",
-        "transcoding": "Transcoding",
-        "bitrate": "Bitrate",
-        "no_active": "No Active Streams"
+        "playing": "Відтворення",
+        "transcoding": "Перекодування",
+        "bitrate": "Бітрейт",
+        "no_active": "Немає активних потоків"
     },
     "flood": {
-        "download": "Download",
-        "upload": "Upload",
+        "download": "Завантаження",
+        "upload": "Відправлення",
         "leech": "Leech",
         "seed": "Seed"
     },
     "changedetectionio": {
-        "totalObserved": "Total Observed",
-        "diffsDetected": "Diffs Detected"
+        "totalObserved": "Всього спостережень",
+        "diffsDetected": "Виявлено відмінності"
     },
     "tautulli": {
-        "playing": "Playing",
-        "transcoding": "Transcoding",
-        "bitrate": "Bitrate",
-        "no_active": "No Active Streams"
+        "playing": "Відтворення",
+        "transcoding": "Перекодування",
+        "bitrate": "Бітрейт",
+        "no_active": "Немає активних потоків"
     },
     "nzbget": {
-        "rate": "Rate",
-        "downloaded": "Downloaded",
-        "remaining": "Remaining"
+        "rate": "Швидкість",
+        "downloaded": "Завантажено",
+        "remaining": "Залишилося"
     },
     "plex": {
-        "streams": "Active Streams",
-        "movies": "Movies",
-        "tv": "TV Shows"
+        "streams": "Активні потоки",
+        "movies": "Фільми",
+        "tv": "TБ шоу"
     },
     "transmission": {
-        "download": "Download",
-        "upload": "Upload",
+        "download": "Завантаження",
+        "upload": "Відправлення",
         "leech": "Leech",
         "seed": "Seed"
     },
     "qbittorrent": {
-        "download": "Download",
-        "upload": "Upload",
+        "download": "Завантаження",
+        "upload": "Відправлення",
         "leech": "Leech",
         "seed": "Seed"
     },
     "downloadstation": {
-        "download": "Download",
-        "upload": "Upload",
+        "download": "Завантаження",
+        "upload": "Відправлення",
         "leech": "Leech",
         "seed": "Seed"
     },
     "sonarr": {
-        "wanted": "Wanted",
-        "queued": "Queued",
-        "series": "Series"
+        "wanted": "Розшукується",
+        "queued": "У черзі",
+        "series": "Серії"
     },
     "radarr": {
-        "wanted": "Wanted",
-        "missing": "Missing",
-        "queued": "Queued",
-        "movies": "Movies"
+        "wanted": "Розшукується",
+        "missing": "Відсутній",
+        "queued": "У черзі",
+        "movies": "Фільми"
     },
     "lidarr": {
-        "wanted": "Wanted",
-        "queued": "Queued",
-        "albums": "Albums"
+        "wanted": "Розшукується",
+        "queued": "У черзі",
+        "albums": "Альбоми"
     },
     "traefik": {
         "middleware": "Middleware",
-        "routers": "Routers",
-        "services": "Services"
+        "routers": "Роутери",
+        "services": "Сервіси"
     },
     "navidrome": {
         "nothing_streaming": "No Active Streams",
         "please_wait": "Please Wait"
     },
     "bazarr": {
-        "missingEpisodes": "Missing Episodes",
-        "missingMovies": "Missing Movies"
+        "missingEpisodes": "Відсутні епізоди",
+        "missingMovies": "Відсутні фільми"
     },
     "ombi": {
-        "pending": "Pending",
-        "approved": "Approved",
-        "available": "Available"
+        "pending": "В очікуванні",
+        "approved": "Затверджено",
+        "available": "Доступно"
     },
     "jellyseerr": {
-        "pending": "Pending",
-        "approved": "Approved",
-        "available": "Available"
+        "pending": "В очікуванні",
+        "approved": "Затверджено",
+        "available": "Доступно"
     },
     "overseerr": {
-        "pending": "Pending",
-        "processing": "Processing",
-        "approved": "Approved",
-        "available": "Available"
+        "pending": "В очікуванні",
+        "processing": "Обробка",
+        "approved": "Затверджено",
+        "available": "Доступно"
     },
     "pihole": {
-        "queries": "Queries",
-        "blocked": "Blocked",
-        "gravity": "Gravity"
+        "queries": "Запити",
+        "blocked": "Заблоковано",
+        "gravity": "Гравітація"
     },
     "adguard": {
-        "queries": "Queries",
-        "blocked": "Blocked",
-        "filtered": "Filtered",
-        "latency": "Latency"
+        "queries": "Запити",
+        "blocked": "Заблоковано",
+        "filtered": "Відфільтровано",
+        "latency": "Затримка"
     },
     "speedtest": {
-        "upload": "Upload",
-        "download": "Download",
-        "ping": "Ping"
+        "upload": "Відправлення",
+        "download": "Завантаження",
+        "ping": "Пінг"
     },
     "portainer": {
-        "running": "Running",
-        "stopped": "Stopped",
-        "total": "Total"
+        "running": "Запущено",
+        "stopped": "Зупинено",
+        "total": "Всього"
     },
     "tdarr": {
-        "queue": "Queue",
-        "processed": "Processed",
-        "errored": "Errored",
-        "saved": "Saved"
+        "queue": "Черга",
+        "processed": "Обробка",
+        "errored": "Помилка",
+        "saved": "Збережено"
     },
     "npm": {
         "enabled": "Enabled",

From bdbe81268be77e21ec5ecf4a090d624df65ec6ca Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:12 +0000
Subject: [PATCH 271/347] Translated using Weblate (German)

Currently translated at 80.2% (228 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index b0a67d8e..2cbe22f4 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 63de2888c4e8e1e416c61a5d1eea0e33d14e1061 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:12 +0000
Subject: [PATCH 272/347] Translated using Weblate (Spanish)

Currently translated at 98.9% (281 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 539e173c..c422bf9b 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memoria utilizada",
         "uptime": "Tiempo en funcionamiento",
         "numberOfLeases": "Alquileres"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 0ab30b711ca664dc76970e54090ba0853beea7c7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:12 +0000
Subject: [PATCH 273/347] Translated using Weblate (French)

Currently translated at 98.9% (281 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index e34fd67b..d28d992c 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Mém. Utilisée",
         "uptime": "Disponibilité",
         "numberOfLeases": "Baux"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From ba87f8b64dca2ec590aedec2642587cfc0b20635 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:06 +0000
Subject: [PATCH 274/347] Translated using Weblate (Portuguese)

Currently translated at 57.7% (164 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 6b41a411..0bbe9dd8 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -401,5 +401,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From fbbf007fc78f42e0619399d842383ae6e25af0b8 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:07 +0000
Subject: [PATCH 275/347] Translated using Weblate (Russian)

Currently translated at 16.9% (48 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 7b0d512d..ae68b9d7 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 2182ffb89440780730dd0e4ea779596cd77007bf Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:07 +0000
Subject: [PATCH 276/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 59.1% (168 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index cc05eecf..e0a166c6 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From f0231e17fd72b856580a9d7e97078411bd18620b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:06 +0000
Subject: [PATCH 277/347] Translated using Weblate (Italian)

Currently translated at 98.5% (280 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 6bf614b1..e913141e 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memoria Utilizzata",
         "uptime": "Tempo di attività",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From ee1fc2fa55fa662e1800168eeb4d09051ec6c163 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:11 +0000
Subject: [PATCH 278/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 27.8% (79 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 069bb58a..10bd3323 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -392,5 +392,10 @@
         "numberOfLeases": "Leases",
         "cpuLoad": "CPU Load",
         "memoryUsed": "Memory Used"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From acbc66f26b31ee4269ae9c4aad1c87e84cbd614d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:12 +0000
Subject: [PATCH 279/347] Translated using Weblate (Vietnamese)

Currently translated at 15.4% (44 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index eff1581b..3c1154c7 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -392,5 +392,10 @@
         "numberOfLeases": "Leases",
         "cpuLoad": "CPU Load",
         "memoryUsed": "Memory Used"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From d0f83aa30a4a72f0dfd99372ff42a45ddcca5a9e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:13 +0000
Subject: [PATCH 280/347] Translated using Weblate (Dutch)

Currently translated at 22.1% (63 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 39d9854f..1986f6b5 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From e0213269c0ddcce191d9a8adae8772e35f8db90a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:13 +0000
Subject: [PATCH 281/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.1% (9 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index a66e55a2..5ec252fc 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From a3e21e56c0ae05d5f6226a7612fb553f79696996 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:09 +0000
Subject: [PATCH 282/347] Translated using Weblate (Catalan)

Currently translated at 90.8% (258 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index eee5828c..20eda896 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From cad721dee2b0bf7e24d955b45c8ee2f72a923572 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:06 +0000
Subject: [PATCH 283/347] Translated using Weblate (Polish)

Currently translated at 96.8% (275 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index 209db63a..a07ff4eb 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Zuyżyta pamięć",
         "uptime": "Czas działania",
         "numberOfLeases": "Dzierżawy"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From ccf8d2c6115eb9d3380908ea8b21c6b8b7d7ac27 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:08 +0000
Subject: [PATCH 284/347] Translated using Weblate (Swedish)

Currently translated at 45.7% (130 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 55411e9d..0957409e 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 0e18d14eb13eb4399c63bc95435f3b44418800ea Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:08 +0000
Subject: [PATCH 285/347] Translated using Weblate (Croatian)

Currently translated at 89.4% (254 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 828f8ed1..5775bc47 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 1f756c1a6796d0fc67438c9a13ab1f751a9cb964 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:09 +0000
Subject: [PATCH 286/347] Translated using Weblate (Hungarian)

Currently translated at 38.0% (108 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 8eb18b02..1fd8582e 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 0d9068c6fa85761e4f1a7e14e64a5ce1b9fb3fc1 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:08 +0000
Subject: [PATCH 287/347] Translated using Weblate (Hebrew)

Currently translated at 35.5% (101 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index a0bd66f9..3f0fd06d 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 513d187567392cd38334f28706896674e324f4be Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:09 +0000
Subject: [PATCH 288/347] Translated using Weblate (Romanian)

Currently translated at 48.2% (137 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 5328837f..9a37802a 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -392,5 +392,10 @@
         "cpuLoad": "CPU Load",
         "memoryUsed": "Memory Used",
         "uptime": "Uptime"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 3b0931c0125d1945b8167f45c4778c07394a93e7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:10 +0000
Subject: [PATCH 289/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 41.1% (117 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 0ce1cc1d..27068ab1 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 4e58341443f2b897fd9ee0bc82d0c2b862ef1b3f Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:09 +0000
Subject: [PATCH 290/347] Translated using Weblate (Yue)

Currently translated at 41.5% (118 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 8791c97f..7b52e4a7 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From b335c9603cc35bebb01bb1671bde2ad9d0f4528a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:12 +0000
Subject: [PATCH 291/347] Translated using Weblate (Finnish)

Currently translated at 43.3% (123 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index f52627d6..59bc8f46 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 7ebd50903624b9fed4074e8950895cf17f291192 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:07 +0000
Subject: [PATCH 292/347] Translated using Weblate (Telugu)

Currently translated at 76.4% (217 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index b988642d..d9a3bed6 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -392,5 +392,10 @@
         "uptime": "Uptime",
         "numberOfLeases": "Leases",
         "memoryUsed": "Memory Used"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 00aacba63934caba32fd51876ce5210b8efbeb25 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:11 +0000
Subject: [PATCH 293/347] Translated using Weblate (Bulgarian)

Currently translated at 16.1% (46 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 5a01d758..1801573b 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 94e156b078d8d6c2e7847e0b8224cc41dcb3ed19 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:07 +0000
Subject: [PATCH 294/347] Translated using Weblate (Turkish)

Currently translated at 81.3% (231 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 08a9992e..2492192a 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 1b847136abc4a34db6b0f88bcb1eca59301ed9cb Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:10 +0000
Subject: [PATCH 295/347] Translated using Weblate (Serbian)

Currently translated at 3.1% (9 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 230033c3..1528616f 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From e549fc50af4a53c17e2c5fb6e3688513f4951715 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:10 +0000
Subject: [PATCH 296/347] Translated using Weblate (Arabic)

Currently translated at 15.4% (44 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index c1610adc..c758b0d4 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From fb9dc36226e7fb79873a123191f5b6b911399044 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:11 +0000
Subject: [PATCH 297/347] Translated using Weblate (Czech)

Currently translated at 79.2% (225 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 9487646d..033a6103 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 2c8ab6e9d663cf9f90af7439ff425b13324c484e Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:11 +0000
Subject: [PATCH 298/347] Translated using Weblate (Danish)

Currently translated at 69.7% (198 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 72e366b2..94574c27 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 5b8d781eb3e10679ba4010a7f620e02dc52ff980 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:13 +0000
Subject: [PATCH 299/347] Translated using Weblate (Malay)

Currently translated at 89.0% (253 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 0da9b6d3..0df04607 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From 5c3d7af929e21619bbac59049379afc176a3b69d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:10 +0000
Subject: [PATCH 300/347] Translated using Weblate (Hindi)

Currently translated at 3.1% (9 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index e2a7dcca..0be477b7 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From a697a6e8d4261104ffb3edc0ab0b268e60cbb2ed Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:10 +0000
Subject: [PATCH 301/347] Translated using Weblate (Esperanto)

Currently translated at 36.2% (103 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index e0b1e3d8..ba51319e 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From ab75534d3e449ea96c2c2bf2b35b1f02c21aebc5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 04:52:08 +0000
Subject: [PATCH 302/347] Translated using Weblate (Ukrainian)

Currently translated at 45.7% (130 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
---
 public/locales/uk/common.json | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json
index bfacda99..501b5334 100644
--- a/public/locales/uk/common.json
+++ b/public/locales/uk/common.json
@@ -392,5 +392,10 @@
         "memoryUsed": "Memory Used",
         "uptime": "Uptime",
         "numberOfLeases": "Leases"
+    },
+    "xteve": {
+        "streams_all": "All Streams",
+        "streams_active": "Active Streams",
+        "streams_xepg": "XEPG Channels"
     }
 }

From ba4cbad60103624bbf9ed6bd1fbc821570322404 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 25 Dec 2022 20:58:20 -0800
Subject: [PATCH 303/347] xteve cleanup

---
 src/widgets/xteve/proxy.js | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/widgets/xteve/proxy.js b/src/widgets/xteve/proxy.js
index 22795b76..ac1b49dc 100644
--- a/src/widgets/xteve/proxy.js
+++ b/src/widgets/xteve/proxy.js
@@ -24,6 +24,7 @@ export default async function xteveProxyHandler(req, res) {
   const payload = { cmd: "status" };
 
   if (widget.username && widget.password) {
+    // eslint-disable-next-line no-unused-vars
      const [status, contentType, data] = await httpProxy(url, {
       method,
       body: JSON.stringify({
@@ -34,14 +35,14 @@ export default async function xteveProxyHandler(req, res) {
     });
 
     if (status !== 200) {
-      return [status, contentType, data];
+      logger.debug("Error logging into xteve", status, url);
+      return res.status(status).json({error: {message: `HTTP Error ${status} logging into xteve`, url, data}});
     }
 
     const json = JSON.parse(data.toString());
 
     if (json?.status !== true) {
-      const message = "Authentication failed.";
-      return res.status(401).end(JSON.stringify({error: { message } }));
+      return res.status(401).json({error: {message: "Authentication failed", url, data}});
     }
 
     payload.token = json.token;
@@ -53,8 +54,8 @@ export default async function xteveProxyHandler(req, res) {
   });
 
   if (status !== 200) {
-    logger.debug("Error %d calling endpoint %s", status, url);
-    return res.status(status, data);
+    logger.debug("Error %d calling xteve endpoint %s", status, url);
+    return res.status(status).json({error: {message: `HTTP Error ${status}`, url, data}});
   }
 
   if (contentType) res.setHeader("Content-Type", contentType);

From 94f43b121016cd17bbce561e89c0ef3476015a87 Mon Sep 17 00:00:00 2001
From: Benoit SERRA <oupsman@oupsman.fr>
Date: Mon, 26 Dec 2022 09:32:12 +0100
Subject: [PATCH 304/347] OPNSense widget (#730)

* Opnsense widget (#2)

* OPNSense widget : initial version, memory usage is inaccurate.

* OPNSense widget : code cleanup in widget.js. Firewall is no longer displayed, so it did not need to be queried.

* Opnsense widget (#3)

* OPNSense widget : initial version, memory usage is inaccurate.

* OPNSense widget : code cleanup in widget.js. Firewall is no longer displayed, so it did not need to be queried.

* OPNSense widget : fixing the CPU code to make it more reliable.

* OPNSense widget : fixing the CPU code to make it more reliable. Removing uptime info

* Update src/widgets/opnsense/component.jsx

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

* Update public/locales/en/common.json

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

* Update src/widgets/opnsense/component.jsx

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

* Update src/widgets/opnsense/component.jsx

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
---
 public/locales/en/common.json      |  6 ++++
 src/widgets/components.js          |  1 +
 src/widgets/opnsense/component.jsx | 48 ++++++++++++++++++++++++++++++
 src/widgets/opnsense/widget.js     | 24 +++++++++++++++
 src/widgets/widgets.js             |  2 ++
 5 files changed, 81 insertions(+)
 create mode 100644 src/widgets/opnsense/component.jsx
 create mode 100644 src/widgets/opnsense/widget.js

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 8436d28b..032c1dfe 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -406,5 +406,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 4ee443ac..10277732 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -29,6 +29,7 @@ const components = {
   nzbget: dynamic(() => import("./nzbget/component")),
   omada: dynamic(() => import("./omada/component")),
   ombi: dynamic(() => import("./ombi/component")),
+  opnsense: dynamic(() => import("./opnsense/component")),
   overseerr: dynamic(() => import("./overseerr/component")),
   paperlessngx: dynamic(() => import("./paperlessngx/component")),
   pihole: dynamic(() => import("./pihole/component")),
diff --git a/src/widgets/opnsense/component.jsx b/src/widgets/opnsense/component.jsx
new file mode 100644
index 00000000..53396b31
--- /dev/null
+++ b/src/widgets/opnsense/component.jsx
@@ -0,0 +1,48 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: activityData, error: activityError } = useWidgetAPI(widget, "activity");
+  const { data: interfaceData, error: interfaceError } = useWidgetAPI(widget, "interface");
+
+  if (activityError || interfaceError) {
+    const finalError = activityError ?? interfaceError;
+    return <Container error={ finalError } />;
+  }
+
+  if (!activityData || !interfaceData) {
+    return (
+      <Container service={service}>
+        <Block label="opnsense.cpu" />
+        <Block label="opnsense.memory" />
+        <Block label="opnsense.wanUpload" />
+        <Block label="opnsense.wanDownload" />
+      </Container>
+    );
+  }
+
+
+  const cpuIdle = activityData.headers[2].match(/ ([0-9.]+)% idle/)[1];
+  const cpu = 100 - parseFloat(cpuIdle);
+  const memory = activityData.headers[3].match(/Mem: (.+) Active,/)[1];
+
+  const wanUpload = interfaceData.interfaces.wan['bytes transmitted'];
+  const wanDownload = interfaceData.interfaces.wan['bytes received'];
+
+  return (
+    <Container service={service}>
+      <Block label="opnsense.cpu" value={t("common.percent", { value: cpu.toFixed(2) })}  />
+      <Block label="opnsense.memory" value={memory} />
+      <Block label="opnsense.wanUpload" value={t("common.bytes", { value: wanUpload })} />
+      <Block label="opnsense.wanDownload" value={t("common.bytes", { value: wanDownload })} />
+
+    </Container>
+  );
+}
diff --git a/src/widgets/opnsense/widget.js b/src/widgets/opnsense/widget.js
new file mode 100644
index 00000000..a144ee4c
--- /dev/null
+++ b/src/widgets/opnsense/widget.js
@@ -0,0 +1,24 @@
+
+import genericProxyHandler from "utils/proxy/handlers/generic";
+
+const widget = {
+  api: "{url}/api/{endpoint}",
+  proxyHandler: genericProxyHandler,
+
+  mappings: {
+    activity: {
+      endpoint: "diagnostics/activity/getActivity",
+      validate: [
+        "headers"
+      ]
+    },
+    interface: {
+      endpoint: "diagnostics/traffic/interface",
+      validate: [
+        "interfaces"
+      ]
+    }
+  },
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 0c53b388..3e73e55f 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -24,6 +24,7 @@ import npm from "./npm/widget";
 import nzbget from "./nzbget/widget";
 import omada from "./omada/widget";
 import ombi from "./ombi/widget";
+import opnsense from "./opnsense/widget";
 import overseerr from "./overseerr/widget";
 import paperlessngx from "./paperlessngx/widget";
 import pihole from "./pihole/widget";
@@ -80,6 +81,7 @@ const widgets = {
   nzbget,
   omada,
   ombi,
+  opnsense,
   overseerr,
   paperlessngx,
   pihole,

From 765c6f9b9912da2902ffd7c5b31bf3097130b340 Mon Sep 17 00:00:00 2001
From: Nonoss117 <nonoss117@gmail.com>
Date: Mon, 26 Dec 2022 05:54:44 +0000
Subject: [PATCH 305/347] Translated using Weblate (French)

Currently translated at 100.0% (284 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index d28d992c..ec134c72 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -394,8 +394,8 @@
         "numberOfLeases": "Baux"
     },
     "xteve": {
-        "streams_all": "All Streams",
-        "streams_active": "Active Streams",
-        "streams_xepg": "XEPG Channels"
+        "streams_all": "Tous les flux",
+        "streams_active": "Flux actif",
+        "streams_xepg": "Canal XEPG"
     }
 }

From cc1f580e465d40e1df1b4622d7d8ab73cd039202 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:28 +0000
Subject: [PATCH 306/347] Translated using Weblate (German)

Currently translated at 79.1% (228 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
 public/locales/de/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 2cbe22f4..e32ba18b 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 762a02f28770844f784e39779de42492584a8f5b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:28 +0000
Subject: [PATCH 307/347] Translated using Weblate (Spanish)

Currently translated at 97.5% (281 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index c422bf9b..bee91f1e 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From d4ee7962ce73d1879cc8a6704958d1d6ae8d7fcd Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:29 +0000
Subject: [PATCH 308/347] Translated using Weblate (French)

Currently translated at 98.6% (284 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index ec134c72..09f3536f 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -397,5 +397,11 @@
         "streams_all": "Tous les flux",
         "streams_active": "Flux actif",
         "streams_xepg": "Canal XEPG"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From fc799000d3b18cb635bea9952ab08d2a70c47f94 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:29 +0000
Subject: [PATCH 309/347] Translated using Weblate (Portuguese)

Currently translated at 56.9% (164 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
 public/locales/pt/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 0bbe9dd8..92a38870 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -406,5 +406,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 87be6b110575c801b3a143d95de3cacff2991acc Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:30 +0000
Subject: [PATCH 310/347] Translated using Weblate (Russian)

Currently translated at 16.6% (48 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
 public/locales/ru/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index ae68b9d7..6fb5d4f4 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 9ad78f82044d46d2875668ef2e5c7f7a66b1a784 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:27 +0000
Subject: [PATCH 311/347] Translated using Weblate (Chinese (Simplified))

Currently translated at 58.3% (168 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
 public/locales/zh-CN/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index e0a166c6..cf4c4a3f 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From fe0eeb533217eb9c70b46220c3a7a1203040fb5d Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:29 +0000
Subject: [PATCH 312/347] Translated using Weblate (Italian)

Currently translated at 97.2% (280 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
 public/locales/it/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index e913141e..466b2655 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From cddf39371472918e07c2d2dc2cd968ae21e01b5a Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:34 +0000
Subject: [PATCH 313/347] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 27.4% (79 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
 public/locales/nb-NO/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 10bd3323..7f9b2c80 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From c08ca4ce443a499717d97210d3ac8220b6afa5e2 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:34 +0000
Subject: [PATCH 314/347] Translated using Weblate (Vietnamese)

Currently translated at 15.2% (44 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
 public/locales/vi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index 3c1154c7..870e3fe5 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 9a70bb7e3d5426334c279ff71a57af826ef87d80 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:35 +0000
Subject: [PATCH 315/347] Translated using Weblate (Dutch)

Currently translated at 21.8% (63 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
 public/locales/nl/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 1986f6b5..c5c9ea0b 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 631e7adb7c3915b40b9f74e45db63e062313e9b7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:35 +0000
Subject: [PATCH 316/347] Translated using Weblate (Chinese (Traditional))

Currently translated at 3.1% (9 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
 public/locales/zh-Hant/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 5ec252fc..fd00cccd 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 7750a1c1f492158625f6325b941289ff6b388bc4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:32 +0000
Subject: [PATCH 317/347] Translated using Weblate (Catalan)

Currently translated at 89.5% (258 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
 public/locales/ca/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 20eda896..2b2fdd9e 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 349f2a1c66459f2bb573ddb222b6db03a5538b7b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:29 +0000
Subject: [PATCH 318/347] Translated using Weblate (Polish)

Currently translated at 95.4% (275 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
 public/locales/pl/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index a07ff4eb..07ce69f2 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From b792ba8267e58a2fd5a1d39ea1e1a6a93db482fa Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:30 +0000
Subject: [PATCH 319/347] Translated using Weblate (Swedish)

Currently translated at 45.1% (130 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
 public/locales/sv/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index 0957409e..d682d368 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 443a073ae31ba23ed915682fd69d21c1a28c2235 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:31 +0000
Subject: [PATCH 320/347] Translated using Weblate (Croatian)

Currently translated at 88.1% (254 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
 public/locales/hr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 5775bc47..b555aa0b 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 040e7845260cd5e9f1693473c573b4467acd2027 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:32 +0000
Subject: [PATCH 321/347] Translated using Weblate (Hungarian)

Currently translated at 37.5% (108 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
 public/locales/hu/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index 1fd8582e..0d77fd4c 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 08c9379ebafb829086aeba8cc0d6610674c3b5c5 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:31 +0000
Subject: [PATCH 322/347] Translated using Weblate (Hebrew)

Currently translated at 35.0% (101 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
 public/locales/he/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 3f0fd06d..e211074c 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 3736194c7c3e8e3446cc1515892317800ff1bfd7 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:32 +0000
Subject: [PATCH 323/347] Translated using Weblate (Romanian)

Currently translated at 47.5% (137 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
 public/locales/ro/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 9a37802a..0a1080e1 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 700fb09e644af9adba25f72033353cb9b6d353be Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:33 +0000
Subject: [PATCH 324/347] Translated using Weblate (Portuguese (Brazil))

Currently translated at 40.6% (117 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
 public/locales/pt-BR/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 27068ab1..68aacbf4 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 87ec2ea20cfc0ebc5e87084d0c62571c93596151 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:31 +0000
Subject: [PATCH 325/347] Translated using Weblate (Yue)

Currently translated at 40.9% (118 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
 public/locales/yue/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 7b52e4a7..1b346827 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 4396d0a5f1ee84e9cd54959fc93cbbaeaa8b47f0 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:28 +0000
Subject: [PATCH 326/347] Translated using Weblate (Finnish)

Currently translated at 42.7% (123 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
 public/locales/fi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 59bc8f46..f7871dac 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 3ca720953a0ee69b3a8442300eb802fa20fea3b4 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:30 +0000
Subject: [PATCH 327/347] Translated using Weblate (Telugu)

Currently translated at 75.3% (217 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
 public/locales/te/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index d9a3bed6..f5c14b37 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 6aa77faea044dbf6f636c52156ce6a837536951b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:34 +0000
Subject: [PATCH 328/347] Translated using Weblate (Bulgarian)

Currently translated at 15.9% (46 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
---
 public/locales/bg/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 1801573b..c30b4c3d 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 3500c81a1c3c042772dedaf9819c3f767a5fdbef Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:30 +0000
Subject: [PATCH 329/347] Translated using Weblate (Turkish)

Currently translated at 80.2% (231 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
---
 public/locales/tr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 2492192a..b4d093bb 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 7803b815af54aa3d4fe7b0ddf567b44d8e1f9d72 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:33 +0000
Subject: [PATCH 330/347] Translated using Weblate (Serbian)

Currently translated at 3.1% (9 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
---
 public/locales/sr/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 1528616f..6e220e04 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From dacfc30ceae153399d893c9351e598285cc4104f Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:32 +0000
Subject: [PATCH 331/347] Translated using Weblate (Arabic)

Currently translated at 15.2% (44 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
---
 public/locales/ar/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index c758b0d4..853ad4c7 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From e99a38063c8f7111c4af9e14fdb52658db24cac3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:34 +0000
Subject: [PATCH 332/347] Translated using Weblate (Czech)

Currently translated at 78.1% (225 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
---
 public/locales/cs/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 033a6103..170c4a21 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From b7b5e4a11799e8c8f86a7767ee702a4422349ece Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:34 +0000
Subject: [PATCH 333/347] Translated using Weblate (Danish)

Currently translated at 68.7% (198 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
---
 public/locales/da/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 94574c27..c8845105 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 810390c1be199de2111830124200cda6d1a3579b Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:35 +0000
Subject: [PATCH 334/347] Translated using Weblate (Malay)

Currently translated at 87.8% (253 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
---
 public/locales/ms/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 0df04607..ed9e4903 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From aa1726df05605840f9955d1cc9614a31573471c3 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:33 +0000
Subject: [PATCH 335/347] Translated using Weblate (Hindi)

Currently translated at 3.1% (9 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
---
 public/locales/hi/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 0be477b7..098362ee 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 54b01b302bcff3be177157438018fef3b330e950 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:33 +0000
Subject: [PATCH 336/347] Translated using Weblate (Esperanto)

Currently translated at 35.7% (103 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
---
 public/locales/eo/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index ba51319e..a073234f 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From e46d291c784f65b72e03158ca5e489bd12b68eb2 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Mon, 26 Dec 2022 08:32:28 +0000
Subject: [PATCH 337/347] Translated using Weblate (Ukrainian)

Currently translated at 45.1% (130 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
---
 public/locales/uk/common.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json
index 501b5334..fa4c12fb 100644
--- a/public/locales/uk/common.json
+++ b/public/locales/uk/common.json
@@ -397,5 +397,11 @@
         "streams_all": "All Streams",
         "streams_active": "Active Streams",
         "streams_xepg": "XEPG Channels"
+    },
+    "opnsense": {
+        "cpu": "CPU Load",
+        "memory": "Active Memory",
+        "wanUpload": "WAN Upload",
+        "wanDownload": "WAN Download"
     }
 }

From 679704949eab76b795125929d57d36557822d77f Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 26 Dec 2022 01:02:01 -0800
Subject: [PATCH 338/347] Fix broken update checker

---
 src/components/version.jsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/version.jsx b/src/components/version.jsx
index 9b1d8cde..34941e68 100644
--- a/src/components/version.jsx
+++ b/src/components/version.jsx
@@ -12,7 +12,7 @@ export default function Version() {
   const revision = process.env.NEXT_PUBLIC_REVISION?.length ? process.env.NEXT_PUBLIC_REVISION : "dev";
   const version = process.env.NEXT_PUBLIC_VERSION?.length ?  process.env.NEXT_PUBLIC_VERSION : "dev";
 
-  const cachedFetcher = (resource) => cachedFetch(resource, 5).then((res) => res.json());
+  const cachedFetcher = (resource) => cachedFetch(resource, 5);
 
   const { data: releaseData } = useSWR("https://api.github.com/repos/benphelps/homepage/releases", cachedFetcher);
 

From 21c0c687cd6f7474ed2069b6711b7de91efe0c83 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 26 Dec 2022 01:17:54 -0800
Subject: [PATCH 339/347] Update README.md

---
 README.md | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index c97c65f9..ec2e1e68 100644
--- a/README.md
+++ b/README.md
@@ -45,15 +45,17 @@
   - Container status (Running / Stopped) & statistics (CPU, Memory, Network)
   - Automatic service discovery (via labels)
 - Service Integration
-  - Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
-  - Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
-  - Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentik, Proxmox
+  - Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli, Plex and more
+  - Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent and more
+  - Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentik, Proxmox and more
 - Information Providers
-  - Coin Market Cap, Mastodon
+  - Coin Market Cap, Mastodon and more
 - Information & Utility Widgets
   - System Stats (Disk, CPU, Memory)
   - Weather via [OpenWeatherMap](https://openweathermap.org/) or [Open-Meteo](https://open-meteo.com/)
-  - Search Bar
+  - Web Search Bar
+  - UniFi Console, Glances and more
+- Instant "Quick-launch" search
 - Customizable
   - 21 theme colors with light and dark mode support
   - Background image support
@@ -63,7 +65,7 @@
 
 If you have any questions, suggestions, or general issues, please start a discussion on the [Discussions](https://github.com/benphelps/homepage/discussions) page.
 
-If you have a more specific issue, please open an issue on the [Issues](https://github.com/benphelps/homepage/issues) page.
+For bug reports, please open an issue on the [Issues](https://github.com/benphelps/homepage/issues) page.
 
 ## Getting Started
 

From 88934ec39af55c7b333baf825763f910a091cd00 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 26 Dec 2022 06:07:43 -0800
Subject: [PATCH 340/347] Correct debug messages in Pyload widget

Closes #733
---
 src/widgets/pyload/proxy.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/widgets/pyload/proxy.js b/src/widgets/pyload/proxy.js
index 5a51c3b7..9cee5fb2 100644
--- a/src/widgets/pyload/proxy.js
+++ b/src/widgets/pyload/proxy.js
@@ -84,9 +84,9 @@ export default async function pyloadProxyHandler(req, res) {
 
         if (data?.error || status !== 200) {
           try {
-            return res.status(status).send({error: {message: "HTTP error communicating with Plex API", data: Buffer.from(data).toString()}});
+            return res.status(status).send({error: {message: "HTTP error communicating with Pyload API", data: Buffer.from(data).toString()}});
           } catch (e) {
-            return res.status(status).send({error: {message: "HTTP error communicating with Plex API", data}});
+            return res.status(status).send({error: {message: "HTTP error communicating with Pyload API", data}});
           }
         }
 
@@ -95,7 +95,7 @@ export default async function pyloadProxyHandler(req, res) {
     }
   } catch (e) {
     logger.error(e);
-    return res.status(500).send({error: {message: `Error communicating with Plex API: ${e.toString()}`}});
+    return res.status(500).send({error: {message: `Error communicating with Pyload API: ${e.toString()}`}});
   }
 
   return res.status(400).json({ error: 'Invalid proxy service type' });

From 2aed46671f17681cc4020b5b73e85a368283003f Mon Sep 17 00:00:00 2001
From: gallegonovato <fran-carro@hotmail.es>
Date: Mon, 26 Dec 2022 11:00:33 +0000
Subject: [PATCH 341/347] Translated using Weblate (Spanish)

Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
 public/locales/es/common.json | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index bee91f1e..c0026c8f 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -394,14 +394,14 @@
         "numberOfLeases": "Alquileres"
     },
     "xteve": {
-        "streams_all": "All Streams",
-        "streams_active": "Active Streams",
-        "streams_xepg": "XEPG Channels"
+        "streams_all": "Todas las corrientes",
+        "streams_active": "Corrientes activas",
+        "streams_xepg": "Canales XEPG"
     },
     "opnsense": {
-        "cpu": "CPU Load",
-        "memory": "Active Memory",
-        "wanUpload": "WAN Upload",
-        "wanDownload": "WAN Download"
+        "cpu": "Carga de la CPU",
+        "memory": "Memoria activa",
+        "wanUpload": "Carga WAN",
+        "wanDownload": "Descargar WAN"
     }
 }

From 75455a23e25cc3dfb3c9abcf06746e1c87e6c73c Mon Sep 17 00:00:00 2001
From: Nonoss117 <nonoss117@gmail.com>
Date: Mon, 26 Dec 2022 11:14:05 +0000
Subject: [PATCH 342/347] Translated using Weblate (French)

Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
 public/locales/fr/common.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 09f3536f..ab46de39 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -399,9 +399,9 @@
         "streams_xepg": "Canal XEPG"
     },
     "opnsense": {
-        "cpu": "CPU Load",
-        "memory": "Active Memory",
-        "wanUpload": "WAN Upload",
-        "wanDownload": "WAN Download"
+        "cpu": "Charge CPU",
+        "memory": "Mém. Utilisée",
+        "wanUpload": "WAN Envoi",
+        "wanDownload": "WAN Récep."
     }
 }

From 5fbc6702bc302f90ef584e067c35ea0c5baa436d Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 28 Dec 2022 16:17:49 -0800
Subject: [PATCH 343/347] Prevent blocking error on GH releases failure

Closes #738
---
 src/components/version.jsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/version.jsx b/src/components/version.jsx
index 34941e68..ef297750 100644
--- a/src/components/version.jsx
+++ b/src/components/version.jsx
@@ -48,7 +48,7 @@ export default function Version() {
       </span>
       {version === "main" || version === "dev" || version === "nightly"
         ? null
-        : releaseData &&
+        : releaseData && latestRelease &&
           compareVersions(latestRelease.tag_name, version) > 0 && (
             <a
               href={latestRelease.html_url}

From 0afc1b96f1daa4af9122b61b602f621588344b8d Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 28 Dec 2022 16:21:04 -0800
Subject: [PATCH 344/347] CPU / memory / disk usage bars start from 0

Closes #737
---
 src/components/widgets/resources/cpu.jsx    | 2 +-
 src/components/widgets/resources/disk.jsx   | 2 +-
 src/components/widgets/resources/memory.jsx | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/components/widgets/resources/cpu.jsx b/src/components/widgets/resources/cpu.jsx
index 6b021193..0382270c 100644
--- a/src/components/widgets/resources/cpu.jsx
+++ b/src/components/widgets/resources/cpu.jsx
@@ -38,7 +38,7 @@ export default function Cpu({ expanded }) {
               <div className="pr-1">{t("resources.load")}</div>
             </div>
           )}
-          <UsageBar percent={100} />
+          <UsageBar percent={0} />
         </div>
       </div>
     );
diff --git a/src/components/widgets/resources/disk.jsx b/src/components/widgets/resources/disk.jsx
index 69f560f6..bed7caef 100644
--- a/src/components/widgets/resources/disk.jsx
+++ b/src/components/widgets/resources/disk.jsx
@@ -38,7 +38,7 @@ export default function Disk({ options, expanded }) {
               <div className="pr-1">{t("resources.total")}</div>
             </span>
           )}
-          <UsageBar percent={100} />
+          <UsageBar percent={0} />
         </div>
       </div>
     );
diff --git a/src/components/widgets/resources/memory.jsx b/src/components/widgets/resources/memory.jsx
index 2888f907..068177df 100644
--- a/src/components/widgets/resources/memory.jsx
+++ b/src/components/widgets/resources/memory.jsx
@@ -38,7 +38,7 @@ export default function Memory({ expanded }) {
               <div className="pr-1">{t("resources.total")}</div>
             </span>
           )}
-          <UsageBar percent={100} />
+          <UsageBar percent={0} />
         </div>
       </div>
     );

From d17a17bd3c9a183edff5195bc35accf89c0f4e7f Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 28 Dec 2022 18:33:14 -0800
Subject: [PATCH 345/347] Use server-side endpoint to properly cache GH release
 data

---
 src/components/version.jsx | 6 +-----
 src/pages/api/releases.js  | 6 ++++++
 2 files changed, 7 insertions(+), 5 deletions(-)
 create mode 100644 src/pages/api/releases.js

diff --git a/src/components/version.jsx b/src/components/version.jsx
index ef297750..de79647b 100644
--- a/src/components/version.jsx
+++ b/src/components/version.jsx
@@ -3,8 +3,6 @@ import useSWR from "swr";
 import { compareVersions } from "compare-versions";
 import { MdNewReleases } from "react-icons/md";
 
-import cachedFetch from "utils/proxy/cached-fetch";
-
 export default function Version() {
   const { t, i18n } = useTranslation();
 
@@ -12,9 +10,7 @@ export default function Version() {
   const revision = process.env.NEXT_PUBLIC_REVISION?.length ? process.env.NEXT_PUBLIC_REVISION : "dev";
   const version = process.env.NEXT_PUBLIC_VERSION?.length ?  process.env.NEXT_PUBLIC_VERSION : "dev";
 
-  const cachedFetcher = (resource) => cachedFetch(resource, 5);
-
-  const { data: releaseData } = useSWR("https://api.github.com/repos/benphelps/homepage/releases", cachedFetcher);
+  const { data: releaseData } = useSWR("/api/releases");
 
   // use Intl.DateTimeFormat to format the date
   const formatDate = (date) => {
diff --git a/src/pages/api/releases.js b/src/pages/api/releases.js
new file mode 100644
index 00000000..b5b3df00
--- /dev/null
+++ b/src/pages/api/releases.js
@@ -0,0 +1,6 @@
+import cachedFetch from "utils/proxy/cached-fetch";
+
+export default async function handler(req, res) {
+  const releasesURL = "https://api.github.com/repos/benphelps/homepage/releases";
+  return res.send(await cachedFetch(releasesURL, 5));
+}

From bc7937db71f56fbdc44732f05d10611a6bc67c67 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 29 Dec 2022 00:25:50 -0800
Subject: [PATCH 346/347] omada widget cleanup

---
 src/widgets/omada/proxy.js | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/widgets/omada/proxy.js b/src/widgets/omada/proxy.js
index e89ad81d..6d476f04 100644
--- a/src/widgets/omada/proxy.js
+++ b/src/widgets/omada/proxy.js
@@ -42,9 +42,9 @@ export default async function omadaProxyHandler(req, res) {
 
     if (widget) {
 
-      const {url} = widget;
+      const { url } = widget;
 
-      const controllerInfoURL = `${widget.url}/api/info`;
+      const controllerInfoURL = `${url}/api/info`;
 
       let [status, contentType, data] = await httpProxy(controllerInfoURL, {
           headers: {
@@ -77,13 +77,13 @@ export default async function omadaProxyHandler(req, res) {
 
       switch (controllerVersionMajor) {
         case 3:
-          loginUrl = `${widget.url}/api/user/login?ajax`;
+          loginUrl = `${url}/api/user/login?ajax`;
           break;
         case 4:
-          loginUrl = `${widget.url}/api/v2/login`;
+          loginUrl = `${url}/api/v2/login`;
           break;
         case 5:
-          loginUrl = `${widget.url}/${cId}/api/v2/login`;
+          loginUrl = `${url}/${cId}/api/v2/login`;
           break;
         default:
           break;
@@ -105,7 +105,7 @@ export default async function omadaProxyHandler(req, res) {
 
       switch (controllerVersionMajor) {
         case 3:
-          sitesUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
+          sitesUrl = `${url}/web/v1/controller?ajax=&token=${token}`;
           body = {
             "method": "getUserSites",
             "params": {
@@ -115,10 +115,10 @@ export default async function omadaProxyHandler(req, res) {
           method = "POST";
           break;
         case 4:
-          sitesUrl = `${widget.url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;          
+          sitesUrl = `${url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;          
           break;
         case 5:
-          sitesUrl = `${widget.url}/${cId}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
+          sitesUrl = `${url}/${cId}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
           break;
         default:
           break;
@@ -133,7 +133,7 @@ export default async function omadaProxyHandler(req, res) {
 
       const sitesResponseData = JSON.parse(data);
 
-      if (sitesResponseData.errorCode > 0) {
+      if (status !== 200 || sitesResponseData.errorCode > 0) {
         logger.debug(`HTTTP ${status} getting sites list: ${sitesResponseData.msg}`);
         return res.status(status).json({error: {message: "Error getting sites list", url, data: sitesResponseData}});
       }
@@ -143,7 +143,7 @@ export default async function omadaProxyHandler(req, res) {
         sitesResponseData.result.data.find(s => s.name === widget.site);
 
       if (!site) {
-        return res.status(status).json({error: {message: `Site ${widget.site} is not found`, url, data}});
+        return res.status(status).json({error: {message: `Site ${widget.site} is not found`, url: sitesUrl, data}});
       }
 
       let siteResponseData;
@@ -156,7 +156,7 @@ export default async function omadaProxyHandler(req, res) {
 
       if (controllerVersionMajor === 3) {
         // Omada v3 controller requires switching site
-        const switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
+        const switchUrl = `${url}/web/v1/controller?ajax=&token=${token}`;
         method = "POST";
         body = {
           method: "switchSite",
@@ -181,7 +181,7 @@ export default async function omadaProxyHandler(req, res) {
           return res.status(status).json({error: {message: "Error switching site", url: switchUrl, data}});
         }
         
-        const statsUrl = `${widget.url}/web/v1/controller?getGlobalStat=&token=${token}`;
+        const statsUrl = `${url}/web/v1/controller?getGlobalStat=&token=${token}`;
         [status, contentType, data] = await httpProxy(statsUrl, {
           method,
           params,

From ee729a7e6a8831381caeb94152631e74f025231a Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 30 Dec 2022 20:31:25 -0800
Subject: [PATCH 347/347] remove error on no discovered services

---
 src/utils/config/api-response.js    | 3 +++
 src/utils/config/service-helpers.js | 4 ----
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/utils/config/api-response.js b/src/utils/config/api-response.js
index a3450537..b03e3831 100644
--- a/src/utils/config/api-response.js
+++ b/src/utils/config/api-response.js
@@ -50,6 +50,9 @@ export async function servicesResponse() {
 
   try {
     discoveredServices = cleanServiceGroups(await servicesFromDocker());
+    if (discoveredServices?.length === 0) {
+      console.debug("No containers were found with homepage labels.");
+    }
   } catch (e) {
     console.error("Failed to discover services, please check docker.yaml for errors or remove example entries.");
     if (e) console.error(e.toString());
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index cccd010b..e95159a6 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -82,10 +82,6 @@ export async function servicesFromDocker() {
     })
   );
 
-  if (serviceServers.every(server => server.services.length === 0)) {
-    throw new Error('All docker servers failed to connect or returned no containers');
-  }
-
   const mappedServiceGroups = [];
 
   serviceServers.forEach((server) => {