@@ -42,6 +45,23 @@ export default function Widget({ options }) {
);
}
+ const wan = defaultSite.health.find(h => h.subsystem === "wan");
+ const lan = defaultSite.health.find(h => h.subsystem === "lan");
+ const wlan = defaultSite.health.find(h => h.subsystem === "wlan");
+ const data = {
+ name: wan.gw_name,
+ uptime: wan["gw_system-stats"].uptime,
+ up: wan.status === 'ok',
+ wlan: {
+ users: wlan.num_user,
+ status: wlan.status
+ },
+ lan: {
+ users: lan.num_user,
+ status: lan.status
+ }
+ };
+
return (
diff --git a/src/pages/api/widgets/unifi.js b/src/pages/api/widgets/unifi.js
deleted file mode 100644
index f8cbcc1e..00000000
--- a/src/pages/api/widgets/unifi.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Controller } from "node-unifi";
-
-export default async function handler(req, res) {
- const { host, port, username, password } = req.query;
-
- if (!host) {
- return res.status(400).json({ error: "Missing host" });
- }
-
- if (!username) {
- return res.status(400).json({ error: "Missing username" });
- }
-
- if (!password) {
- return res.status(400).json({ error: "Missing password" });
- }
-
- const controller = new Controller({
- host: host,
- port: port,
- sslverify: false
- });
-
- try {
- //login to the controller
- await controller.login(username, password);
-
- //retrieve sites
- const sites = await controller.getSitesStats();
- const default_site = sites.find(s => s.name == "default");
- const wan = default_site.health.find(h => h.subsystem == "wan");
- const lan = default_site.health.find(h => h.subsystem == "lan");
- const wlan = default_site.health.find(h => h.subsystem == "wlan");
-
- return res.status(200).json({
- name: wan.gw_name,
- uptime: wan['gw_system-stats']['uptime'],
- up: wan.status == 'ok',
- wlan: {
- users: wlan.num_user,
- status: wlan.status
- },
- lan: {
- users: lan.num_user,
- status: lan.status
- }
- });
- } catch (e) {
- return res.status(400).json({
- error: `Error communicating with UniFi Console: ${e.message}`
- })
- }
-}
diff --git a/src/utils/proxy/api-helpers.js b/src/utils/proxy/api-helpers.js
index 55cd333c..904c9e96 100644
--- a/src/utils/proxy/api-helpers.js
+++ b/src/utils/proxy/api-helpers.js
@@ -2,7 +2,7 @@ export function formatApiCall(url, args) {
const find = /\{.*?\}/g;
const replace = (match) => {
const key = match.replace(/\{|\}/g, "");
- return args[key];
+ return args[key] || "";
};
return url.replace(/\/+$/, "").replace(find, replace);
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
new file mode 100644
index 00000000..d4d50e0d
--- /dev/null
+++ b/src/widgets/unifi/proxy.js
@@ -0,0 +1,103 @@
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
+import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
+import { getSettings } from "utils/config/config";
+import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
+import widgets from "widgets/widgets";
+
+const logger = createLogger("unifiProxyHandler");
+
+async function getWidget(req) {
+ const { group, service, type } = req.query;
+
+ let widget = null;
+ if (type === 'unifi_console') {
+ const settings = getSettings();
+ widget = settings.unifi_console;
+ if (!widget) {
+ logger.debug("There is no unifi_console section in settings.yaml");
+ return null;
+ }
+ widget.type = "unifi";
+ } else {
+ if (!group || !service) {
+ logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
+ return null;
+ }
+
+ widget = await getServiceWidget(group, service);
+
+ if (!widget) {
+ logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
+ return null;
+ }
+ }
+
+ return widget;
+}
+
+async function login(widget) {
+ logger.debug("Unifi isn't logged in or is rejecting the reqeust, logging in.");
+
+ const loginBody = { username: widget.username, password: widget.password, remember: true };
+ let loginUrl = `${widget.url}/api`;
+ if (widget.version === "udm-pro") {
+ loginUrl += "/auth"
+ }
+ loginUrl += "/login";
+
+ const loginParams = { method: "POST", body: JSON.stringify(loginBody) };
+ const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, loginParams);
+ return [status, contentType, data, responseHeaders];
+}
+
+export default async function unifiProxyHandler(req, res) {
+ const widget = await getWidget(req);
+ if (!widget) {
+ return res.status(400).json({ error: "Invalid proxy service type" });
+ }
+
+ const api = widgets?.[widget.type]?.api;
+ if (!api) {
+ return res.status(403).json({ error: "Service does not support API calls" });
+ }
+
+ widget.prefx = "";
+ if (widget.version === "udm-pro") {
+ widget.prefix = "/proxy/network"
+ }
+
+ const { endpoint } = req.query;
+ const url = new URL(formatApiCall(api, { endpoint, ...widget }));
+ const params = { method: "GET", headers: {} };
+ setCookieHeader(url, params);
+
+ let [status, contentType, data, responseHeaders] = await httpProxy(url, params);
+ if (status === 401) {
+ [status, contentType, data, responseHeaders] = await login(widget);
+
+ if (status !== 200) {
+ logger.error("HTTP %d logging in to Unifi. Data: %s", status, data);
+ return res.status(status).end(data);
+ }
+
+ const json = JSON.parse(data.toString());
+ if (json?.meta?.rc !== "ok") {
+ logger.error("Error logging in to Unifi: Data: %s", data);
+ return res.status(401).end(data);
+ }
+
+ addCookieToJar(url, responseHeaders);
+ setCookieHeader(url, params);
+ }
+
+ [status, contentType, data] = await httpProxy(url, params);
+
+ if (status !== 200) {
+ logger.error("HTTP %d getting data from Unifi. Data: %s", status, data);
+ }
+
+ if (contentType) res.setHeader("Content-Type", contentType);
+ return res.status(status).send(data);
+}
diff --git a/src/widgets/unifi/widget.js b/src/widgets/unifi/widget.js
new file mode 100644
index 00000000..928ebd76
--- /dev/null
+++ b/src/widgets/unifi/widget.js
@@ -0,0 +1,14 @@
+import unifiProxyHandler from "./proxy";
+
+const widget = {
+ api: "{url}{prefix}/api/{endpoint}",
+ proxyHandler: unifiProxyHandler,
+
+ mappings: {
+ "stat/sites": {
+ endpoint: "stat/sites",
+ },
+ }
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 04665c78..a4cab76b 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -27,6 +27,7 @@ import strelaysrv from "./strelaysrv/widget";
import tautulli from "./tautulli/widget";
import traefik from "./traefik/widget";
import transmission from "./transmission/widget";
+import unifi from "./unifi/widget";
const widgets = {
adguard,
@@ -59,6 +60,8 @@ const widgets = {
tautulli,
traefik,
transmission,
+ unifi,
+ unifi_console: unifi
};
export default widgets;
From ad1d1e751dd9edf54c951b0cb93953892443b9cb Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 7 Oct 2022 23:26:16 -0700
Subject: [PATCH 05/50] Refactor unifi proxy for udm-pro compatibility
---
src/widgets/unifi/proxy.js | 51 ++++++++++++++++++++++++++-----------
src/widgets/unifi/widget.js | 2 +-
2 files changed, 37 insertions(+), 16 deletions(-)
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index d4d50e0d..91446051 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -38,17 +38,22 @@ async function getWidget(req) {
}
async function login(widget) {
- logger.debug("Unifi isn't logged in or is rejecting the reqeust, logging in.");
+ let endpoint = widget.udmp ? "auth/login" : "login";
+ widget.prefix = ""; // never use prefix for login
+ const api = widgets?.[widget.type]?.api;
+ const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
const loginBody = { username: widget.username, password: widget.password, remember: true };
- let loginUrl = `${widget.url}/api`;
- if (widget.version === "udm-pro") {
- loginUrl += "/auth"
- }
- loginUrl += "/login";
- const loginParams = { method: "POST", body: JSON.stringify(loginBody) };
- const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, loginParams);
+ const headers = {
+ "Content-Type": "application/json"
+ };
+
+ const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, {
+ method: "POST",
+ body: JSON.stringify(loginBody),
+ headers
+ });
return [status, contentType, data, responseHeaders];
}
@@ -62,9 +67,22 @@ export default async function unifiProxyHandler(req, res) {
if (!api) {
return res.status(403).json({ error: "Service does not support API calls" });
}
+
+ // determine if udm-pro from base url
+ let [status, contentType, data, responseHeaders] = await httpProxy(`https://${widget.host}`);
+ if (responseHeaders['x-csrf-token']) {
+ widget.udmp = true
+ }
- widget.prefx = "";
- if (widget.version === "udm-pro") {
+ if (!widget.port) {
+ widget.port = 8443;
+ if (widget.udmp) {
+ widget.port = 443
+ }
+ }
+
+ widget.prefix = "";
+ if (widget.udmp) {
widget.prefix = "/proxy/network"
}
@@ -73,29 +91,32 @@ export default async function unifiProxyHandler(req, res) {
const params = { method: "GET", headers: {} };
setCookieHeader(url, params);
- let [status, contentType, data, responseHeaders] = await httpProxy(url, params);
+ [status, contentType, data, responseHeaders] = await httpProxy(url, params);
if (status === 401) {
+ logger.debug("Unifi isn't logged in or rejected the reqeust, attempting login.");
[status, contentType, data, responseHeaders] = await login(widget);
if (status !== 200) {
- logger.error("HTTP %d logging in to Unifi. Data: %s", status, data);
+ logger.error("HTTP %d logging in to Unifi. Data: %s", status, data);
return res.status(status).end(data);
}
const json = JSON.parse(data.toString());
- if (json?.meta?.rc !== "ok") {
+ if (!(json?.meta?.rc === "ok" || json.login_time)) {
logger.error("Error logging in to Unifi: Data: %s", data);
return res.status(401).end(data);
}
addCookieToJar(url, responseHeaders);
setCookieHeader(url, params);
+
+ logger.debug("Retrying Unifi reqeust after login.");
+ [status, contentType, data, responseHeaders] = await httpProxy(url, params);
}
- [status, contentType, data] = await httpProxy(url, params);
if (status !== 200) {
- logger.error("HTTP %d getting data from Unifi. Data: %s", status, data);
+ logger.error("HTTP %d getting data from Unifi endpoint %s. Data: %s", status, url.href, data);
}
if (contentType) res.setHeader("Content-Type", contentType);
diff --git a/src/widgets/unifi/widget.js b/src/widgets/unifi/widget.js
index 928ebd76..f4b1366f 100644
--- a/src/widgets/unifi/widget.js
+++ b/src/widgets/unifi/widget.js
@@ -1,7 +1,7 @@
import unifiProxyHandler from "./proxy";
const widget = {
- api: "{url}{prefix}/api/{endpoint}",
+ api: "https://{host}:{port}{prefix}/api/{endpoint}",
proxyHandler: unifiProxyHandler,
mappings: {
From e03822df6eabc2ab98272c656112cb9823e0e5a4 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 8 Oct 2022 00:45:00 -0700
Subject: [PATCH 06/50] Add UniFI console service widget
---
public/locales/en/common.json | 4 +++
src/widgets/components.js | 1 +
src/widgets/unifi/component.jsx | 56 +++++++++++++++++++++++++++++++++
3 files changed, 61 insertions(+)
create mode 100644 src/widgets/unifi/component.jsx
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index af8fc197..669ebd27 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -36,6 +36,10 @@
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
+ "lan": "LAN",
+ "wlan": "WLAN",
+ "up": "UP",
+ "down": "DOWN",
"wait": "Please wait"
},
"docker": {
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 5357c070..0ff197af 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -32,6 +32,7 @@ const components = {
tautulli: dynamic(() => import("./tautulli/component")),
traefik: dynamic(() => import("./traefik/component")),
transmission: dynamic(() => import("./transmission/component")),
+ unifi_console: dynamic(() => import("./unifi/component")),
};
export default components;
diff --git a/src/widgets/unifi/component.jsx b/src/widgets/unifi/component.jsx
new file mode 100644
index 00000000..82b33941
--- /dev/null
+++ b/src/widgets/unifi/component.jsx
@@ -0,0 +1,56 @@
+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, "stat/sites");
+
+ if (statsError || statsData?.error) {
+ return ;
+ }
+
+ const defaultSite = statsData?.data?.find(s => s.name === "default");
+
+ if (!defaultSite) {
+ return (
+
+
+
+
+
+
+ );
+ }
+
+ const wan = defaultSite.health.find(h => h.subsystem === "wan");
+ const lan = defaultSite.health.find(h => h.subsystem === "lan");
+ const wlan = defaultSite.health.find(h => h.subsystem === "wlan");
+ const data = {
+ name: wan.gw_name,
+ uptime: wan["gw_system-stats"].uptime,
+ up: wan.status === 'ok',
+ wlan: {
+ users: wlan.num_user,
+ status: wlan.status
+ },
+ lan: {
+ users: lan.num_user,
+ status: lan.status
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ );
+}
From 2bd9c8eddcca78bc30817e33f1388d17fd0231b6 Mon Sep 17 00:00:00 2001
From: Jason Fischer
Date: Sat, 8 Oct 2022 13:52:07 -0700
Subject: [PATCH 07/50] Cache console version check result
---
src/widgets/unifi/component.jsx | 10 +++++--
src/widgets/unifi/proxy.js | 52 ++++++++++++++++-----------------
src/widgets/unifi/widget.js | 2 +-
3 files changed, 33 insertions(+), 31 deletions(-)
diff --git a/src/widgets/unifi/component.jsx b/src/widgets/unifi/component.jsx
index 82b33941..0ab862bd 100644
--- a/src/widgets/unifi/component.jsx
+++ b/src/widgets/unifi/component.jsx
@@ -45,12 +45,16 @@ export default function Component({ service }) {
}
};
+ const uptime = `${t("common.number", { value: data.uptime / 86400, maximumFractionDigits: 1 })} ${t("unifi.days")}`;
+ const lanUsers = `${t("common.number", { value: data.lan.users })} ${t("unifi.users")}`;
+ const wanUsers = `${t("common.number", { value: data.wlan.users })} ${t("unifi.users")}`;
+
return (
-
+
-
-
+
+
);
}
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 91446051..181f43d7 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -1,3 +1,5 @@
+import cache from "memory-cache";
+
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
@@ -6,7 +8,10 @@ import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
import widgets from "widgets/widgets";
-const logger = createLogger("unifiProxyHandler");
+const udmpPrefix = "/proxy/network";
+const proxyName = "unifiProxyHandler";
+const prefixCacheKey = `${proxyName}__prefix`;
+const logger = createLogger(proxyName);
async function getWidget(req) {
const { group, service, type } = req.query;
@@ -38,21 +43,18 @@ async function getWidget(req) {
}
async function login(widget) {
- let endpoint = widget.udmp ? "auth/login" : "login";
- widget.prefix = ""; // never use prefix for login
- const api = widgets?.[widget.type]?.api;
- const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
+ let loginUrl = `${widget.url}/api`;
+ if (widget.prefix === udmpPrefix) {
+ loginUrl += "/auth"
+ }
+ loginUrl += "/login";
const loginBody = { username: widget.username, password: widget.password, remember: true };
-
- const headers = {
- "Content-Type": "application/json"
- };
-
+ const headers = { "Content-Type": "application/json" };
const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, {
method: "POST",
body: JSON.stringify(loginBody),
- headers
+ headers,
});
return [status, contentType, data, responseHeaders];
}
@@ -67,24 +69,21 @@ export default async function unifiProxyHandler(req, res) {
if (!api) {
return res.status(403).json({ error: "Service does not support API calls" });
}
-
- // determine if udm-pro from base url
- let [status, contentType, data, responseHeaders] = await httpProxy(`https://${widget.host}`);
- if (responseHeaders['x-csrf-token']) {
- widget.udmp = true
- }
- if (!widget.port) {
- widget.port = 8443;
- if (widget.udmp) {
- widget.port = 443
+ let [status, contentType, data, responseHeaders] = [];
+ let prefix = cache.get(prefixCacheKey);
+ 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
+ [status, contentType, data, responseHeaders] = await httpProxy(widget.url);
+ prefix = "";
+ if (responseHeaders["x-csrf-token"]) {
+ prefix = udmpPrefix;
}
+ cache.put(prefixCacheKey, prefix);
}
- widget.prefix = "";
- if (widget.udmp) {
- widget.prefix = "/proxy/network"
- }
+ widget.prefix = prefix;
const { endpoint } = req.query;
const url = new URL(formatApiCall(api, { endpoint, ...widget }));
@@ -110,11 +109,10 @@ export default async function unifiProxyHandler(req, res) {
addCookieToJar(url, responseHeaders);
setCookieHeader(url, params);
- logger.debug("Retrying Unifi reqeust after login.");
+ logger.debug("Retrying Unifi request after login.");
[status, contentType, data, responseHeaders] = await httpProxy(url, params);
}
-
if (status !== 200) {
logger.error("HTTP %d getting data from Unifi endpoint %s. Data: %s", status, url.href, data);
}
diff --git a/src/widgets/unifi/widget.js b/src/widgets/unifi/widget.js
index f4b1366f..928ebd76 100644
--- a/src/widgets/unifi/widget.js
+++ b/src/widgets/unifi/widget.js
@@ -1,7 +1,7 @@
import unifiProxyHandler from "./proxy";
const widget = {
- api: "https://{host}:{port}{prefix}/api/{endpoint}",
+ api: "{url}{prefix}/api/{endpoint}",
proxyHandler: unifiProxyHandler,
mappings: {
From 7ee3113d8a2525f3b46f5c3fa9d98bfc67e86001 Mon Sep 17 00:00:00 2001
From: Jason Fischer
Date: Sat, 8 Oct 2022 13:58:19 -0700
Subject: [PATCH 08/50] Rename unifi_console service widget to unifi - This
rename is necessary as the Unifi service widet gets its config data from a
different location than the unifi_console information widget
---
src/widgets/components.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 0ff197af..c2a6705e 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -32,7 +32,7 @@ const components = {
tautulli: dynamic(() => import("./tautulli/component")),
traefik: dynamic(() => import("./traefik/component")),
transmission: dynamic(() => import("./transmission/component")),
- unifi_console: dynamic(() => import("./unifi/component")),
+ unifi: dynamic(() => import("./unifi/component")),
};
export default components;
From 42da3eca28c9744eb99264b4e658120c1918d4b7 Mon Sep 17 00:00:00 2001
From: Jason Fischer
Date: Sat, 8 Oct 2022 13:59:09 -0700
Subject: [PATCH 09/50] Standardize on double quoted strings
---
src/widgets/unifi/proxy.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 181f43d7..43a2e46f 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -17,7 +17,7 @@ async function getWidget(req) {
const { group, service, type } = req.query;
let widget = null;
- if (type === 'unifi_console') {
+ if (type === "unifi_console") {
const settings = getSettings();
widget = settings.unifi_console;
if (!widget) {
From fe1064b173be9a9093ed2afbfbdb0b4793c5c56e Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 8 Oct 2022 14:02:12 -0700
Subject: [PATCH 10/50] Rename unifi_console info widget to unifi
---
.../{unifi_console/unifi_console.jsx => unifi/unifi.jsx} | 2 +-
src/components/widgets/widget.jsx | 2 +-
src/widgets/unifi/proxy.js | 6 +++---
src/widgets/widgets.js | 1 -
4 files changed, 5 insertions(+), 6 deletions(-)
rename src/components/widgets/{unifi_console/unifi_console.jsx => unifi/unifi.jsx} (99%)
diff --git a/src/components/widgets/unifi_console/unifi_console.jsx b/src/components/widgets/unifi/unifi.jsx
similarity index 99%
rename from src/components/widgets/unifi_console/unifi_console.jsx
rename to src/components/widgets/unifi/unifi.jsx
index 7427bd23..ae7f1a7f 100644
--- a/src/components/widgets/unifi_console/unifi_console.jsx
+++ b/src/components/widgets/unifi/unifi.jsx
@@ -9,7 +9,7 @@ export default function Widget({ options }) {
const { t } = useTranslation();
// eslint-disable-next-line no-param-reassign
- options.type = "unifi_console";
+ options.type = "unifi";
const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites");
if (statsError || statsData?.error) {
diff --git a/src/components/widgets/widget.jsx b/src/components/widgets/widget.jsx
index ac5353eb..fc5a72a5 100644
--- a/src/components/widgets/widget.jsx
+++ b/src/components/widgets/widget.jsx
@@ -10,7 +10,7 @@ const widgetMappings = {
greeting: dynamic(() => import("components/widgets/greeting/greeting")),
datetime: dynamic(() => import("components/widgets/datetime/datetime")),
logo: dynamic(() => import("components/widgets/logo/logo"), { ssr: false }),
- unifi_console: dynamic(() => import("components/widgets/unifi_console/unifi_console")),
+ unifi: dynamic(() => import("components/widgets/unifi/unifi")),
};
export default function Widget({ widget }) {
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 43a2e46f..61682ef8 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -17,11 +17,11 @@ async function getWidget(req) {
const { group, service, type } = req.query;
let widget = null;
- if (type === "unifi_console") {
+ if (type === "unifi") {
const settings = getSettings();
- widget = settings.unifi_console;
+ widget = settings.unifi;
if (!widget) {
- logger.debug("There is no unifi_console section in settings.yaml");
+ logger.debug("There is no unifi section in settings.yaml");
return null;
}
widget.type = "unifi";
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index a4cab76b..c922a945 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -61,7 +61,6 @@ const widgets = {
traefik,
transmission,
unifi,
- unifi_console: unifi
};
export default widgets;
From d1b6dad14dca425b94c8acfc82d5559ed718c9b0 Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 8 Oct 2022 14:36:08 -0700
Subject: [PATCH 11/50] Infer unifi port, use api widget property for login
---
src/widgets/unifi/proxy.js | 16 ++++++++++------
src/widgets/unifi/widget.js | 2 +-
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 61682ef8..601e4242 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -43,12 +43,9 @@ async function getWidget(req) {
}
async function login(widget) {
- let loginUrl = `${widget.url}/api`;
- if (widget.prefix === udmpPrefix) {
- loginUrl += "/auth"
- }
- loginUrl += "/login";
-
+ const endpoint = (widget.prefix === udmpPrefix) ? "auth/login" : "login";
+ const api = widgets?.[widget.type]?.api?.replace("{prefix}", ""); // no prefix for login url
+ const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
const loginBody = { username: widget.username, password: widget.password, remember: true };
const headers = { "Content-Type": "application/json" };
const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, {
@@ -85,6 +82,13 @@ export default async function unifiProxyHandler(req, res) {
widget.prefix = prefix;
+ if (!widget.port) {
+ widget.port = 8443;
+ if (widget.prefix == udmpPrefix) {
+ widget.port = 443
+ }
+ }
+
const { endpoint } = req.query;
const url = new URL(formatApiCall(api, { endpoint, ...widget }));
const params = { method: "GET", headers: {} };
diff --git a/src/widgets/unifi/widget.js b/src/widgets/unifi/widget.js
index 928ebd76..0ac3c311 100644
--- a/src/widgets/unifi/widget.js
+++ b/src/widgets/unifi/widget.js
@@ -1,7 +1,7 @@
import unifiProxyHandler from "./proxy";
const widget = {
- api: "{url}{prefix}/api/{endpoint}",
+ api: "{url}:{port}{prefix}/api/{endpoint}",
proxyHandler: unifiProxyHandler,
mappings: {
From fbac27f504f07ce2a3557d8f70e6fe424a8ecbad Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 8 Oct 2022 17:47:52 -0700
Subject: [PATCH 12/50] Fix unifi service lan/wlan labels
---
src/widgets/unifi/component.jsx | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/widgets/unifi/component.jsx b/src/widgets/unifi/component.jsx
index 0ab862bd..aa4204e4 100644
--- a/src/widgets/unifi/component.jsx
+++ b/src/widgets/unifi/component.jsx
@@ -15,6 +15,9 @@ export default function Component({ service }) {
return ;
}
+ const wlanLabel = t("unifi.wlan") + " " + t("unifi.users")
+ const lanLabel = t("unifi.lan") + " " + t("unifi.users")
+
const defaultSite = statsData?.data?.find(s => s.name === "default");
if (!defaultSite) {
@@ -22,8 +25,8 @@ export default function Component({ service }) {
-
-
+
+
);
}
@@ -46,15 +49,13 @@ export default function Component({ service }) {
};
const uptime = `${t("common.number", { value: data.uptime / 86400, maximumFractionDigits: 1 })} ${t("unifi.days")}`;
- const lanUsers = `${t("common.number", { value: data.lan.users })} ${t("unifi.users")}`;
- const wanUsers = `${t("common.number", { value: data.wlan.users })} ${t("unifi.users")}`;
return (
-
-
+
+
);
}
From d26ae30fa6c21ac810a9cf2a972bdfcc36cadd75 Mon Sep 17 00:00:00 2001
From: Ben Phelps
Date: Sun, 9 Oct 2022 13:30:37 +0300
Subject: [PATCH 13/50] remove old code
---
src/pages/index.jsx | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/pages/index.jsx b/src/pages/index.jsx
index 92605f95..b4eb50e1 100644
--- a/src/pages/index.jsx
+++ b/src/pages/index.jsx
@@ -263,8 +263,6 @@ function Home({ initialSettings }) {
export default function Wrapper({ initialSettings, fallback }) {
const wrappedStyle = {};
if (initialSettings && initialSettings.background) {
- // wrappedStyle.backgroundImage = `url(${initialSettings.background})`;
- // wrappedStyle.backgroundSize = "cover";
const opacity = initialSettings.backgroundOpacity ?? 1;
const opacityValue = 1 - opacity;
wrappedStyle.backgroundImage = `
From d2dc51d49c85e3b22a4253921ee81e2b303980d2 Mon Sep 17 00:00:00 2001
From: Ben Phelps
Date: Sun, 9 Oct 2022 13:31:00 +0300
Subject: [PATCH 14/50] add services and bookmarks as manifest shortcuts
---
src/pages/site.webmanifest.jsx | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/pages/site.webmanifest.jsx b/src/pages/site.webmanifest.jsx
index ff9d638f..10a448a3 100644
--- a/src/pages/site.webmanifest.jsx
+++ b/src/pages/site.webmanifest.jsx
@@ -1,16 +1,36 @@
import checkAndCopyConfig, { getSettings } from "utils/config/config";
import themes from "utils/styles/themes";
+import { servicesResponse, bookmarksResponse } from "utils/config/api-response";
export async function getServerSideProps({ res }) {
checkAndCopyConfig("settings.yaml");
const settings = getSettings();
+ const services = await servicesResponse();
+ const bookmarks = await bookmarksResponse();
const color = settings.color || "slate";
const theme = settings.theme || "dark";
+ const serviceShortcuts = services.map((group) =>
+ group.services.map((service) => ({
+ name: service.name,
+ url: service.href,
+ description: service.description,
+ }))
+ );
+
+ const bookmarkShortcuts = bookmarks.map((group) =>
+ group.bookmarks.map((service) => ({
+ name: service.name,
+ url: service.href,
+ }))
+ );
+
+ const shortcuts = [...serviceShortcuts, ...bookmarkShortcuts].flat();
+
const manifest = {
- name: "Homepage",
- short_name: "Homepage",
+ name: settings.title || "Homepage",
+ short_name: settings.title || "Homepage",
icons: [
{
src: "/android-chrome-192x192.png?v=2",
@@ -23,6 +43,7 @@ export async function getServerSideProps({ res }) {
type: "image/png",
},
],
+ shortcuts,
theme_color: themes[color][theme],
background_color: themes[color][theme],
display: "standalone",
From fe7fa5c060d9625a71be99e9afa266b21a88b18b Mon Sep 17 00:00:00 2001
From: Ben Phelps
Date: Sun, 9 Oct 2022 13:34:08 +0300
Subject: [PATCH 15/50] fix network stats when using podman #254
---
src/widgets/docker/component.jsx | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/widgets/docker/component.jsx b/src/widgets/docker/component.jsx
index 10e55fcb..542fbde7 100644
--- a/src/widgets/docker/component.jsx
+++ b/src/widgets/docker/component.jsx
@@ -40,14 +40,16 @@ export default function Component({ service }) {
);
}
+ const network = statsData.stats.networks?.eth0 || statsData.stats.networks?.network;
+
return (
- {statsData.stats.networks && (
+ {network && (
<>
-
-
+
+
>
)}
From dedd725fae4f4557abf00acbee21888ff3659fa7 Mon Sep 17 00:00:00 2001
From: Paco Culebras <69261057+pacoculebras@users.noreply.github.com>
Date: Sun, 9 Oct 2022 16:47:21 +0200
Subject: [PATCH 16/50] Update README.md
Add Catalan translation
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c1f5e23f..2eeb6dc9 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
- Full i18n support with automatic language detection
- - Translantions for Chinese, Dutch, Finnish, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
+ - Translantions for Catalan, Chinese, Dutch, Finnish, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
- Service & Web Bookmarks
- Docker Integration
From 69c9a449b11740ddf16a0c6384b498fe99cc2f4f Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 9 Oct 2022 09:15:46 -0700
Subject: [PATCH 17/50] Revert "Rename unifi_console info widget to unifi"
---
.../{unifi/unifi.jsx => unifi_console/unifi_console.jsx} | 2 +-
src/components/widgets/widget.jsx | 2 +-
src/widgets/unifi/proxy.js | 6 +++---
src/widgets/widgets.js | 1 +
4 files changed, 6 insertions(+), 5 deletions(-)
rename src/components/widgets/{unifi/unifi.jsx => unifi_console/unifi_console.jsx} (99%)
diff --git a/src/components/widgets/unifi/unifi.jsx b/src/components/widgets/unifi_console/unifi_console.jsx
similarity index 99%
rename from src/components/widgets/unifi/unifi.jsx
rename to src/components/widgets/unifi_console/unifi_console.jsx
index ae7f1a7f..7427bd23 100644
--- a/src/components/widgets/unifi/unifi.jsx
+++ b/src/components/widgets/unifi_console/unifi_console.jsx
@@ -9,7 +9,7 @@ export default function Widget({ options }) {
const { t } = useTranslation();
// eslint-disable-next-line no-param-reassign
- options.type = "unifi";
+ options.type = "unifi_console";
const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites");
if (statsError || statsData?.error) {
diff --git a/src/components/widgets/widget.jsx b/src/components/widgets/widget.jsx
index fc5a72a5..ac5353eb 100644
--- a/src/components/widgets/widget.jsx
+++ b/src/components/widgets/widget.jsx
@@ -10,7 +10,7 @@ const widgetMappings = {
greeting: dynamic(() => import("components/widgets/greeting/greeting")),
datetime: dynamic(() => import("components/widgets/datetime/datetime")),
logo: dynamic(() => import("components/widgets/logo/logo"), { ssr: false }),
- unifi: dynamic(() => import("components/widgets/unifi/unifi")),
+ unifi_console: dynamic(() => import("components/widgets/unifi_console/unifi_console")),
};
export default function Widget({ widget }) {
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 601e4242..60ef4403 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -17,11 +17,11 @@ async function getWidget(req) {
const { group, service, type } = req.query;
let widget = null;
- if (type === "unifi") {
+ if (type === "unifi_console") {
const settings = getSettings();
- widget = settings.unifi;
+ widget = settings.unifi_console;
if (!widget) {
- logger.debug("There is no unifi section in settings.yaml");
+ logger.debug("There is no unifi_console section in settings.yaml");
return null;
}
widget.type = "unifi";
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index c922a945..a4cab76b 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -61,6 +61,7 @@ const widgets = {
traefik,
transmission,
unifi,
+ unifi_console: unifi
};
export default widgets;
From 86b12debc58e5c9a8ba1cc3ac25b89e2d5c33ddb Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 9 Oct 2022 09:17:50 -0700
Subject: [PATCH 18/50] Revert "Infer unifi port"
---
src/widgets/unifi/proxy.js | 7 -------
src/widgets/unifi/widget.js | 2 +-
2 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 60ef4403..53ee49f0 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -82,13 +82,6 @@ export default async function unifiProxyHandler(req, res) {
widget.prefix = prefix;
- if (!widget.port) {
- widget.port = 8443;
- if (widget.prefix == udmpPrefix) {
- widget.port = 443
- }
- }
-
const { endpoint } = req.query;
const url = new URL(formatApiCall(api, { endpoint, ...widget }));
const params = { method: "GET", headers: {} };
diff --git a/src/widgets/unifi/widget.js b/src/widgets/unifi/widget.js
index 0ac3c311..928ebd76 100644
--- a/src/widgets/unifi/widget.js
+++ b/src/widgets/unifi/widget.js
@@ -1,7 +1,7 @@
import unifiProxyHandler from "./proxy";
const widget = {
- api: "{url}:{port}{prefix}/api/{endpoint}",
+ api: "{url}{prefix}/api/{endpoint}",
proxyHandler: unifiProxyHandler,
mappings: {
From 04da8f3925f43f9695805d6b1118e18b4cba37ed Mon Sep 17 00:00:00 2001
From: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 9 Oct 2022 15:13:27 -0700
Subject: [PATCH 19/50] lint
---
src/widgets/unifi/component.jsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/widgets/unifi/component.jsx b/src/widgets/unifi/component.jsx
index aa4204e4..8a654a51 100644
--- a/src/widgets/unifi/component.jsx
+++ b/src/widgets/unifi/component.jsx
@@ -15,8 +15,8 @@ export default function Component({ service }) {
return ;
}
- const wlanLabel = t("unifi.wlan") + " " + t("unifi.users")
- const lanLabel = t("unifi.lan") + " " + t("unifi.users")
+ const wlanLabel = `${t("unifi.wlan")} ${t("unifi.users")}`
+ const lanLabel = `${t("unifi.lan")} ${t("unifi.users")}`
const defaultSite = statsData?.data?.find(s => s.name === "default");
From 260201c2b40a27dc0ff782d315552c4a0217f0b5 Mon Sep 17 00:00:00 2001
From: Jason Fischer
Date: Sun, 9 Oct 2022 20:05:28 -0700
Subject: [PATCH 20/50] Decompose i18n labels for Unifi widget - Needed to
decompose i18n labels for Unifi widget in order for field visibility setting
to work correctly - Fixed weird edge case where a call to cached-fetch would
fail if no duration was passed - Have VS Code hide the .next and node_modules
folders from tree view
---
.vscode/settings.json | 6 ++++++
public/locales/en/common.json | 4 ++--
src/utils/proxy/cached-fetch.js | 5 +++++
src/widgets/unifi/component.jsx | 13 +++++--------
4 files changed, 18 insertions(+), 10 deletions(-)
create mode 100644 .vscode/settings.json
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..5a9e97f1
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,6 @@
+{
+ "files.exclude": {
+ "**/.next": true,
+ "**/node_modules": true
+ }
+}
\ No newline at end of file
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 669ebd27..b1097904 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -36,8 +36,8 @@
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
- "lan": "LAN",
- "wlan": "WLAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
diff --git a/src/utils/proxy/cached-fetch.js b/src/utils/proxy/cached-fetch.js
index 22eba37f..0ed39562 100644
--- a/src/utils/proxy/cached-fetch.js
+++ b/src/utils/proxy/cached-fetch.js
@@ -1,8 +1,13 @@
import cache from "memory-cache";
+const defaultDuration = 5;
+
export default async function cachedFetch(url, duration) {
const cached = cache.get(url);
+ // eslint-disable-next-line no-param-reassign
+ duration = duration || defaultDuration;
+
if (cached) {
return cached;
}
diff --git a/src/widgets/unifi/component.jsx b/src/widgets/unifi/component.jsx
index 8a654a51..e2db8e77 100644
--- a/src/widgets/unifi/component.jsx
+++ b/src/widgets/unifi/component.jsx
@@ -15,9 +15,6 @@ export default function Component({ service }) {
return ;
}
- const wlanLabel = `${t("unifi.wlan")} ${t("unifi.users")}`
- const lanLabel = `${t("unifi.lan")} ${t("unifi.users")}`
-
const defaultSite = statsData?.data?.find(s => s.name === "default");
if (!defaultSite) {
@@ -25,8 +22,8 @@ export default function Component({ service }) {
-
-
+
+
);
}
@@ -45,7 +42,7 @@ export default function Component({ service }) {
lan: {
users: lan.num_user,
status: lan.status
- }
+ },
};
const uptime = `${t("common.number", { value: data.uptime / 86400, maximumFractionDigits: 1 })} ${t("unifi.days")}`;
@@ -54,8 +51,8 @@ export default function Component({ service }) {
-
-
+
+
);
}
From c1d476997b7006fa1c8723aa895b99dae599f56e Mon Sep 17 00:00:00 2001
From: hunkyn
Date: Sun, 9 Oct 2022 20:20:06 +0200
Subject: [PATCH 21/50] Added translation using Weblate (Telugu)
---
public/locales/te/common.json | 1 +
1 file changed, 1 insertion(+)
create mode 100644 public/locales/te/common.json
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/public/locales/te/common.json
@@ -0,0 +1 @@
+{}
From ce86d06006e14c765ba1f6b60fc994785465f27f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Benn=C3=A0ssar=20Carretero?=
Date: Thu, 6 Oct 2022 12:21:24 +0000
Subject: [PATCH 22/50] Translated using Weblate (Spanish)
Currently translated at 98.3% (121 of 123 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
public/locales/es/common.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index fe9a7253..7568d743 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -176,8 +176,8 @@
"failedLoginsLast24H": "Inicios de sesión fallidos (24h)"
},
"proxmox": {
- "mem": "MEM",
- "cpu": "CPU",
+ "mem": "Memoria",
+ "cpu": "Procesador",
"lxc": "LXC",
"vms": "VMs"
}
From 2d14230763219ef2801e8c39ad4fb87ad955e540 Mon Sep 17 00:00:00 2001
From: Nonoss117
Date: Wed, 5 Oct 2022 18:33:41 +0000
Subject: [PATCH 23/50] Translated using Weblate (French)
Currently translated at 100.0% (123 of 123 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 c0a72e95..2f187ee7 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -176,9 +176,9 @@
"failedLoginsLast24H": "Cnx. échouées (24h)"
},
"proxmox": {
- "mem": "MEM",
- "cpu": "CPU",
- "lxc": "LXC",
+ "mem": "Mém",
+ "cpu": "Cpu",
+ "lxc": "LxC",
"vms": "VMs"
}
}
From 49a3f3e249c6c0d773d8c5b92dea4896ab0ae581 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?yahoo=EF=BD=9E=EF=BD=9E?=
Date: Thu, 6 Oct 2022 01:20:43 +0000
Subject: [PATCH 24/50] Translated using Weblate (Chinese (Simplified))
Currently translated at 99.1% (122 of 123 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
public/locales/zh-CN/common.json | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index 4fcc1702..d87c4064 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -162,22 +162,22 @@
"mastodon": {
"user_count": "用户",
"status_count": "Posts",
- "domain_count": "Domains"
+ "domain_count": "域"
},
"strelaysrv": {
- "numActiveSessions": "Sessions",
- "dataRelayed": "Relayed",
- "numConnections": "Connections",
- "transferRate": "Rate"
+ "numActiveSessions": "会话",
+ "dataRelayed": "中继",
+ "numConnections": "连接",
+ "transferRate": "速度"
},
"authentik": {
- "users": "Users",
- "loginsLast24H": "Logins (24h)",
- "failedLoginsLast24H": "Failed Logins (24h)"
+ "users": "用户",
+ "loginsLast24H": "登录 (24h)",
+ "failedLoginsLast24H": "登录失败 (24h)"
},
"proxmox": {
- "mem": "MEM",
- "cpu": "CPU",
+ "mem": "内存",
+ "cpu": "处理器",
"lxc": "LXC",
"vms": "VMs"
}
From d186ff16ddb66d4828ea980bc946e459cef745c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Benn=C3=A0ssar=20Carretero?=
Date: Thu, 6 Oct 2022 12:22:36 +0000
Subject: [PATCH 25/50] Translated using Weblate (Catalan)
Currently translated at 99.1% (122 of 123 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
public/locales/ca/common.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 8ef784cb..4a16397d 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -177,8 +177,8 @@
},
"proxmox": {
"vms": "VMs",
- "mem": "MEM",
- "cpu": "CPU",
+ "mem": "Memòria",
+ "cpu": "Processador",
"lxc": "LXC"
}
}
From 13ee38bd12e47f05d33b1045737ceb3aaa14d237 Mon Sep 17 00:00:00 2001
From: Kai Huuhko
Date: Fri, 7 Oct 2022 06:10:01 +0000
Subject: [PATCH 26/50] Translated using Weblate (Finnish)
Currently translated at 100.0% (123 of 123 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
public/locales/fi/common.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 133a0f32..2b0419d3 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -176,9 +176,9 @@
"failedLoginsLast24H": "Epäonnistuneita kirjautumisia (24h)"
},
"proxmox": {
- "mem": "MEM",
+ "mem": "RAM",
"cpu": "CPU",
"lxc": "LXC",
- "vms": "VMs"
+ "vms": "VKt"
}
}
From 4ac6e4334375b9cecd607bb5d7f6e3b3646c9165 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Sun, 9 Oct 2022 18:20:10 +0000
Subject: [PATCH 27/50] Translated using Weblate (Telugu)
Currently translated at 100.0% (0 of 0 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
public/locales/te/common.json | 185 +++++++++++++++++++++++++++++++++-
1 file changed, 184 insertions(+), 1 deletion(-)
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 0967ef42..773ba909 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -1 +1,184 @@
-{}
+{
+ "readarr": {
+ "books": "Books",
+ "wanted": "Wanted",
+ "queued": "Queued"
+ },
+ "adguard": {
+ "blocked": "Blocked",
+ "filtered": "Filtered",
+ "latency": "Latency",
+ "queries": "Queries"
+ },
+ "strelaysrv": {
+ "numActiveSessions": "Sessions",
+ "numConnections": "Connections",
+ "dataRelayed": "Relayed",
+ "transferRate": "Rate"
+ },
+ "widget": {
+ "missing_type": "Missing Widget Type: {{type}}",
+ "api_error": "API Error",
+ "status": "Status"
+ },
+ "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"
+ },
+ "docker": {
+ "rx": "RX",
+ "tx": "TX",
+ "mem": "MEM",
+ "cpu": "CPU",
+ "offline": "Offline"
+ },
+ "emby": {
+ "playing": "Playing",
+ "transcoding": "Transcoding",
+ "bitrate": "Bitrate",
+ "no_active": "No Active Streams"
+ },
+ "tautulli": {
+ "playing": "Playing",
+ "transcoding": "Transcoding",
+ "bitrate": "Bitrate",
+ "no_active": "No Active Streams"
+ },
+ "nzbget": {
+ "rate": "Rate",
+ "remaining": "Remaining",
+ "downloaded": "Downloaded"
+ },
+ "sabnzbd": {
+ "rate": "Rate",
+ "queue": "Queue",
+ "timeleft": "Time Left"
+ },
+ "rutorrent": {
+ "active": "Active",
+ "upload": "Upload",
+ "download": "Download"
+ },
+ "transmission": {
+ "download": "Download",
+ "upload": "Upload",
+ "leech": "Leech",
+ "seed": "Seed"
+ },
+ "qbittorrent": {
+ "download": "Download",
+ "upload": "Upload",
+ "leech": "Leech",
+ "seed": "Seed"
+ },
+ "sonarr": {
+ "wanted": "Wanted",
+ "queued": "Queued",
+ "series": "Series"
+ },
+ "radarr": {
+ "wanted": "Wanted",
+ "queued": "Queued",
+ "movies": "Movies"
+ },
+ "lidarr": {
+ "wanted": "Wanted",
+ "queued": "Queued",
+ "albums": "Albums"
+ },
+ "bazarr": {
+ "missingEpisodes": "Missing Episodes",
+ "missingMovies": "Missing Movies"
+ },
+ "ombi": {
+ "pending": "Pending",
+ "approved": "Approved",
+ "available": "Available"
+ },
+ "jellyseerr": {
+ "pending": "Pending",
+ "approved": "Approved",
+ "available": "Available"
+ },
+ "overseerr": {
+ "pending": "Pending",
+ "approved": "Approved",
+ "available": "Available"
+ },
+ "pihole": {
+ "queries": "Queries",
+ "blocked": "Blocked",
+ "gravity": "Gravity"
+ },
+ "speedtest": {
+ "upload": "Upload",
+ "download": "Download",
+ "ping": "Ping"
+ },
+ "portainer": {
+ "running": "Running",
+ "stopped": "Stopped",
+ "total": "Total"
+ },
+ "traefik": {
+ "routers": "Routers",
+ "services": "Services",
+ "middleware": "Middleware"
+ },
+ "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"
+ },
+ "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"
+ },
+ "mastodon": {
+ "user_count": "Users",
+ "status_count": "Posts",
+ "domain_count": "Domains"
+ },
+ "authentik": {
+ "users": "Users",
+ "loginsLast24H": "Logins (24h)",
+ "failedLoginsLast24H": "Failed Logins (24h)"
+ },
+ "proxmox": {
+ "mem": "MEM",
+ "cpu": "CPU",
+ "lxc": "LXC",
+ "vms": "VMs"
+ }
+}
From a8a715dd30993a49dde3ada38d994c47acbf8bb3 Mon Sep 17 00:00:00 2001
From: hunkyn
Date: Sun, 9 Oct 2022 23:53:54 +0000
Subject: [PATCH 28/50] Translated using Weblate (Telugu)
Currently translated at 95.1% (117 of 123 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
public/locales/te/common.json | 210 +++++++++++++++++-----------------
1 file changed, 105 insertions(+), 105 deletions(-)
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 773ba909..d9e0989f 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -1,179 +1,179 @@
{
"readarr": {
- "books": "Books",
- "wanted": "Wanted",
- "queued": "Queued"
+ "books": "పుస్తకాలు",
+ "wanted": "కావలెను",
+ "queued": "క్యూయూఎడ్"
},
"adguard": {
- "blocked": "Blocked",
- "filtered": "Filtered",
- "latency": "Latency",
- "queries": "Queries"
+ "blocked": "నిరోధించబడింది",
+ "filtered": "ఫిల్టర్ చేయబడింది",
+ "latency": "జాప్యం",
+ "queries": "ప్రశ్నలు"
},
"strelaysrv": {
- "numActiveSessions": "Sessions",
- "numConnections": "Connections",
- "dataRelayed": "Relayed",
- "transferRate": "Rate"
+ "numActiveSessions": "సెషన్స్",
+ "numConnections": "కనెక్షన్లు",
+ "dataRelayed": "రెలయెడఁ",
+ "transferRate": "రేటు"
},
"widget": {
- "missing_type": "Missing Widget Type: {{type}}",
- "api_error": "API Error",
- "status": "Status"
+ "missing_type": "విడ్జెట్ లేదు: {{type}}",
+ "api_error": "API లోపం",
+ "status": "హోదా"
},
"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"
+ "cpu": "సీ పి యూ",
+ "total": "మొత్తం",
+ "free": "ఉచిత",
+ "used": "ఉపయోగించబడిన",
+ "load": "లోడ్"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
- "offline": "Offline"
+ "offline": "ఆఫ్లైన్"
},
"emby": {
- "playing": "Playing",
- "transcoding": "Transcoding",
- "bitrate": "Bitrate",
- "no_active": "No Active Streams"
+ "playing": "ఆడుతున్నారు",
+ "transcoding": "ట్రాన్స్కోడింగ్",
+ "bitrate": "బిట్రేట్",
+ "no_active": "యాక్టివ్ స్ట్రీమ్లు లేవు"
},
"tautulli": {
- "playing": "Playing",
- "transcoding": "Transcoding",
- "bitrate": "Bitrate",
- "no_active": "No Active Streams"
+ "playing": "ఆడుతున్నారు",
+ "transcoding": "ట్రాన్స్కోడింగ్",
+ "bitrate": "బిట్రేట్",
+ "no_active": "యాక్టివ్ స్ట్రీమ్లు లేవు"
},
"nzbget": {
- "rate": "Rate",
- "remaining": "Remaining",
- "downloaded": "Downloaded"
+ "rate": "రేట్",
+ "remaining": "మిగిలింది",
+ "downloaded": "డౌన్లోడ్ చేయబడింది"
},
"sabnzbd": {
- "rate": "Rate",
- "queue": "Queue",
- "timeleft": "Time Left"
+ "rate": "రేట్",
+ "queue": "వరుస",
+ "timeleft": "మిగిలి వున్న సమయం"
},
"rutorrent": {
- "active": "Active",
- "upload": "Upload",
- "download": "Download"
+ "active": "చురుకుగా",
+ "upload": "అప్లోడ్",
+ "download": "డౌన్లోడ్"
},
"transmission": {
- "download": "Download",
- "upload": "Upload",
- "leech": "Leech",
- "seed": "Seed"
+ "download": "డౌన్లోడ్",
+ "upload": "అప్లోడ్",
+ "leech": "జలగ",
+ "seed": "సీడ్"
},
"qbittorrent": {
- "download": "Download",
- "upload": "Upload",
- "leech": "Leech",
- "seed": "Seed"
+ "download": "డౌన్లోడ్",
+ "upload": "అప్లోడ్",
+ "leech": "లీచ్",
+ "seed": "సీడ్"
},
"sonarr": {
- "wanted": "Wanted",
- "queued": "Queued",
- "series": "Series"
+ "wanted": "కావలెను",
+ "queued": "క్యూయూఎడ్",
+ "series": "సిరీస్"
},
"radarr": {
- "wanted": "Wanted",
- "queued": "Queued",
- "movies": "Movies"
+ "wanted": "కావలెను",
+ "queued": "క్యూయూఎడ్",
+ "movies": "సినిమాలు"
},
"lidarr": {
- "wanted": "Wanted",
- "queued": "Queued",
- "albums": "Albums"
+ "wanted": "కావలెను",
+ "queued": "క్యూయూఎడ్",
+ "albums": "ఆల్బములు"
},
"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",
- "approved": "Approved",
- "available": "Available"
+ "pending": "పెండింగ్",
+ "approved": "ఆమోదించబడింది",
+ "available": "అందుబాటులో"
},
"pihole": {
- "queries": "Queries",
- "blocked": "Blocked",
- "gravity": "Gravity"
+ "queries": "ప్రశ్నలు",
+ "blocked": "నిరోధించబడింది",
+ "gravity": "గురుత్వాకర్షణ"
},
"speedtest": {
- "upload": "Upload",
- "download": "Download",
- "ping": "Ping"
+ "upload": "అప్లోడ్",
+ "download": "డౌన్లోడ్",
+ "ping": "పింగ్"
},
"portainer": {
- "running": "Running",
- "stopped": "Stopped",
- "total": "Total"
+ "running": "నడుస్తోంది",
+ "stopped": "ఆగిపోయింది",
+ "total": "మొత్తం"
},
"traefik": {
- "routers": "Routers",
- "services": "Services",
- "middleware": "Middleware"
+ "routers": "రౌటర్లు",
+ "services": "సేవలు",
+ "middleware": "మిడిల్వేర్"
},
"npm": {
- "enabled": "Enabled",
+ "enabled": "ప్రారంభించబడింది",
"disabled": "Disabled",
- "total": "Total"
+ "total": "మొత్తం"
},
"coinmarketcap": {
- "configure": "Configure one or more crypto currencies to track",
- "1hour": "1 Hour",
- "1day": "1 Day",
- "7days": "7 Days",
- "30days": "30 Days"
+ "configure": "ట్రాక్ చేయడానికి ఒకటి లేదా అంతకంటే ఎక్కువ క్రిప్టో కరెన్సీలను కాన్ఫిగర్ చేయండి",
+ "1hour": "1 గంట",
+ "1day": "1 రోజు",
+ "7days": "7 రోజులు",
+ "30days": "30 రోజులు"
},
"gotify": {
- "apps": "Applications",
- "clients": "Clients",
- "messages": "Messages"
+ "apps": "అప్లికేషన్లు",
+ "clients": "ఖాతాదారులు",
+ "messages": "సందేశాలు"
},
"prowlarr": {
- "enableIndexers": "Indexers",
- "numberOfGrabs": "Grabs",
- "numberOfQueries": "Queries",
- "numberOfFailGrabs": "Fail Grabs",
- "numberOfFailQueries": "Fail Queries"
+ "enableIndexers": "సూచికలు",
+ "numberOfGrabs": "గ్రాబ్స్",
+ "numberOfQueries": "ప్రశ్నలు",
+ "numberOfFailGrabs": "ఫెయిల్ గ్రాబ్స్",
+ "numberOfFailQueries": "విఫలమైన ప్రశ్నలు"
},
"jackett": {
- "configured": "Configured",
- "errored": "Errored"
+ "configured": "కాన్ఫిగర్ చేయబడింది",
+ "errored": "పొరపాటు జరిగింది"
},
"mastodon": {
- "user_count": "Users",
- "status_count": "Posts",
- "domain_count": "Domains"
+ "user_count": "వినియోగదారులు",
+ "status_count": "పోస్ట్లు",
+ "domain_count": "డొమైన్లు"
},
"authentik": {
- "users": "Users",
- "loginsLast24H": "Logins (24h)",
- "failedLoginsLast24H": "Failed Logins (24h)"
+ "users": "వినియోగదారులు",
+ "loginsLast24H": "లాగిన్లు (24గం)",
+ "failedLoginsLast24H": "విఫలమైన లాగిన్లు (24గం)"
},
"proxmox": {
"mem": "MEM",
From a6fc171539a0c4ffa17674f9aafb6f54e62bea54 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:41 +0000
Subject: [PATCH 29/50] Translated using Weblate (German)
Currently translated at 89.3% (118 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
---
public/locales/de/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 0b84664f..0070cb5a 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 6dc0eac9f8202acf05c29b6df849b164bee0cf3b Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:42 +0000
Subject: [PATCH 30/50] Translated using Weblate (Spanish)
Currently translated at 91.6% (121 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
---
public/locales/es/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 7568d743..3184d8b7 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -180,5 +180,16 @@
"cpu": "Procesador",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "up": "UP",
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 69626157ed86bb61f3ca08a147a5f2c90e9bca1d Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:42 +0000
Subject: [PATCH 31/50] Translated using Weblate (French)
Currently translated at 93.1% (123 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
---
public/locales/fr/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 2f187ee7..e893fccb 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -180,5 +180,16 @@
"cpu": "Cpu",
"lxc": "LxC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 7874eb146790bf1da59036115da30ddbbd760baf Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:42 +0000
Subject: [PATCH 32/50] Translated using Weblate (Portuguese)
Currently translated at 87.1% (115 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
---
public/locales/pt/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index fc7b3c9c..a8257926 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -191,5 +191,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From a6f7c48cc3aff7509170762153967ffb6c928dd0 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:43 +0000
Subject: [PATCH 33/50] Translated using Weblate (Russian)
Currently translated at 17.4% (23 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
---
public/locales/ru/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index d06131fd..57e1eb93 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From c9e784515489b841c401eaf6a755047b419208c4 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:43 +0000
Subject: [PATCH 34/50] Translated using Weblate (Chinese (Simplified))
Currently translated at 92.4% (122 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
---
public/locales/zh-CN/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index d87c4064..d80a0534 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -180,5 +180,16 @@
"cpu": "处理器",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From b13754f174c180b173658a9a3af10b03f885562a Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:44 +0000
Subject: [PATCH 35/50] Translated using Weblate (Italian)
Currently translated at 58.3% (77 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
---
public/locales/it/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 09f32213..9403315c 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wait": "Please wait",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN"
}
}
From 797b9662679e21d64c5028e48127d8a027d7694d Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:41 +0000
Subject: [PATCH 36/50] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?=
=?UTF-8?q?=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Currently translated at 59.8% (79 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
---
public/locales/nb-NO/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index cea70d93..dc9992d4 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 494b2ebd085ca43f01b7e4402fa23439af833eca Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:44 +0000
Subject: [PATCH 37/50] Translated using Weblate (Vietnamese)
Currently translated at 33.3% (44 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
---
public/locales/vi/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index 736120cf..5a27fd85 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 90cd18735a4d8f8b6a06ba3b2ca0563e81738db4 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:45 +0000
Subject: [PATCH 38/50] Translated using Weblate (Dutch)
Currently translated at 47.7% (63 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
---
public/locales/nl/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index b13cd912..07250217 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "lan_users": "LAN Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From dc0744f9d7c53f781867f58873a892c903a35cfe Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:45 +0000
Subject: [PATCH 39/50] Translated using Weblate (Chinese (Traditional))
Currently translated at 6.8% (9 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
---
public/locales/zh-Hant/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 70dba911..3ad0ed06 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 4b110cf7a8474e90db031e20ec730ac73c90bbdd Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:38 +0000
Subject: [PATCH 40/50] Translated using Weblate (Catalan)
Currently translated at 92.4% (122 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
---
public/locales/ca/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 4a16397d..4f46fff0 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -180,5 +180,16 @@
"mem": "Memòria",
"cpu": "Processador",
"lxc": "LXC"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 182b66b53f459f96012bec4c7084cfe3b442a98d Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:40 +0000
Subject: [PATCH 41/50] Translated using Weblate (Polish)
Currently translated at 74.2% (98 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
---
public/locales/pl/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index 4eb9ffa1..d34b7c80 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 60519a288100e858ab147d3483e45008da8e37f7 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:34 +0000
Subject: [PATCH 42/50] Translated using Weblate (Swedish)
Currently translated at 81.0% (107 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
---
public/locales/sv/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index c42ecabb..b36e77ae 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From d4a5245d1aa57255d3d375eefbf376ff1bd22573 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:35 +0000
Subject: [PATCH 43/50] Translated using Weblate (Croatian)
Currently translated at 87.1% (115 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
---
public/locales/hr/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 36b970a0..e11164b4 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 1f006a409382e4dc1151d7bf123420b26811e52f Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:39 +0000
Subject: [PATCH 44/50] Translated using Weblate (Hungarian)
Currently translated at 81.8% (108 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
---
public/locales/hu/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index ac4d7fff..581420ea 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 7e6fcd84181a304ef82a1f4815134e4acc04474a Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:35 +0000
Subject: [PATCH 45/50] Translated using Weblate (Hebrew)
Currently translated at 76.5% (101 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
---
public/locales/he/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 9414f038..532fce39 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 702ede8b9b14fbcc5247ab706cc32ba30262dfdf Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:36 +0000
Subject: [PATCH 46/50] Translated using Weblate (Romanian)
Currently translated at 89.3% (118 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
---
public/locales/ro/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index eaa9af3a..c3371cd0 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -180,5 +180,16 @@
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 1524a6a6cf47450175362c92327e697499506f02 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:36 +0000
Subject: [PATCH 47/50] Translated using Weblate (Portuguese (Brazil))
Currently translated at 87.1% (115 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
---
public/locales/pt-BR/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json
index 5596ac64..61e704d8 100644
--- a/public/locales/pt-BR/common.json
+++ b/public/locales/pt-BR/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From efeaa995e27ea2c42f02d0448f4b5cd56883f157 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:37 +0000
Subject: [PATCH 48/50] Translated using Weblate (Yue)
Currently translated at 89.3% (118 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
---
public/locales/yue/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 72e2ddde..a49767c4 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}
From 9f55ec9a638df63cbc63d0ed755232d3d2a19a7a Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:39 +0000
Subject: [PATCH 49/50] Translated using Weblate (Finnish)
Currently translated at 93.1% (123 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
---
public/locales/fi/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 2b0419d3..c4654377 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VKt"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "wait": "Please wait",
+ "days": "Days",
+ "wan": "WAN",
+ "up": "UP",
+ "down": "DOWN"
}
}
From 91795f2d0725ae3a6c44959f15b43d2439e75d53 Mon Sep 17 00:00:00 2001
From: Anonymous
Date: Mon, 10 Oct 2022 05:12:39 +0000
Subject: [PATCH 50/50] Translated using Weblate (Telugu)
Currently translated at 88.6% (117 of 132 strings)
Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
---
public/locales/te/common.json | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index d9e0989f..c5a5323d 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -180,5 +180,16 @@
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
+ },
+ "unifi": {
+ "users": "Users",
+ "uptime": "System Uptime",
+ "days": "Days",
+ "wan": "WAN",
+ "lan_users": "LAN Users",
+ "wlan_users": "WLAN Users",
+ "up": "UP",
+ "down": "DOWN",
+ "wait": "Please wait"
}
}