diff --git a/Plan/src/main/resources/assets/plan/plan/bGljZW5zZV9rZXlz.txt b/Plan/src/main/resources/assets/plan/plan/bGljZW5zZV9rZXlz.txt new file mode 100644 index 000000000..a99f67be4 --- /dev/null +++ b/Plan/src/main/resources/assets/plan/plan/bGljZW5zZV9rZXlz.txt @@ -0,0 +1 @@ +45VvUnNtiDHKZ+hq3vqx204q+tmLRE/koVskJLaT2+ipY8G1ThqcLZjUMuF79lYLpRIqpAt4KcY= \ No newline at end of file diff --git a/Plan/src/main/resources/assets/plan/plan/bGljZW5zZV9wYXNz.txt b/Plan/src/main/resources/assets/plan/plan/bGljZW5zZV9wYXNz.txt new file mode 100644 index 000000000..18a3d0c37 --- /dev/null +++ b/Plan/src/main/resources/assets/plan/plan/bGljZW5zZV9wYXNz.txt @@ -0,0 +1 @@ +YEQ4eTdZPzUpUV4zcTp6NkE7XEw= \ No newline at end of file diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_CN.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_CN.yml index 95f2fbfad..d40f47bd6 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_CN.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_CN.yml @@ -257,6 +257,7 @@ html: noServers: "数据库中找不到服务器" noServersLong: '看起来 Plan 没有安装在任何游戏服务器上或者游戏服务器未连接到相同的数据库。 群组网络教程请参见:wiki' noSpongeChunks: "区块数据在 Sponge 服务端不可用" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS、实体或块数据不是从代理服务器收集的,因为它们没有游戏滴答循环。" predictedNewPlayerRetention: "这个数值是基于之前的玩家数据预测的" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "查看玩家基础图表" page_network_playerbase_overview: "查看玩家基础数字" page_network_players: "查看玩家列表选项卡" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "查看代理的插件选项卡" page_network_retention: "查看玩家保留选项卡" page_network_server_list: "查看服务器列表" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "查看服务器玩家基础图表" page_server_playerbase_overview: "查看服务器玩家基础数字" page_server_players: "查看服务器玩家列表选项卡" + page_server_plugin_history: "See Plugin History" page_server_plugins: "查看服务器的插件选项卡" page_server_retention: "查看玩家保留选项卡" page_server_sessions: "查看服务器会话选项卡" @@ -788,6 +791,7 @@ html: many: "使用 {number} 台服务器的数据。" single: "使用 1 台服务器的数据" two: "使用 2 台服务器的数据" + showFullQuery: "Show Full Query" to: ">到 " view: "日期范围" performQuery: "执行查询!" @@ -820,6 +824,8 @@ html: success: "新用户注册成功!你现在可以登录了。" usernameTip: "用户名最多可以包含 50 个字符。" text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "点击展开" comparing15days: "对比 15 天的情况" comparing30daysAgo: "对比 30 天前和现在的情况" @@ -871,6 +877,9 @@ plugin: emptyIP: "server.properties 中的 IP 为空且未使用备用 IP。这可能会导致地址出错!" geoDisabled: "已关闭地理位置收集。(Data.Geolocations: false)" geoInternetRequired: "Plan 需要在首次运行时访问互联网以下载 GeoLite2 地理位置数据库。" + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "正在储存之前关机前留下的会话。" webserverDisabled: "网页服务器未初始化。(WebServer.DisableWebServer: true)" webserver: "网页服务器已在 ${0} ( ${1} ) 端口上运行" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_CS.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_CS.yml index 9e54d7979..107b3eefd 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_CS.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_CS.yml @@ -257,6 +257,7 @@ html: noServers: "Žádné servery nenalezeny v databázi" noServersLong: 'Vypadá to, že plugin není nainstalován na žádném serveru nebo není propojen s databází. Podívejte se na tutoriál na wiki.' noSpongeChunks: "Chunky nejsou na Sponge dostupné" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Tato hodnota je odhad založený na předchozích hráčích" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "použít data {number} serverů" single: "použít data 1 serveru" two: "použít data 2 serverů" + showFullQuery: "Show Full Query" to: ">do" view: "Zobrazit pohled" performQuery: "Provést dotaz!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Uživatelské jméno může být dlouhé 50 znaků." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Klikněte pro rozbalení" comparing15days: "Srovnání posledních 15 dní" comparing30daysAgo: "Srovnání posledních 60 dní" @@ -871,6 +877,9 @@ plugin: emptyIP: "IP v server.properties je prázdné & Alternative_IP se nepoužívá. Mohou být poskytnuty špatné odkazy!" geoDisabled: "Sbírání geolokace není aktivní. (Data.Geolocations: false)" geoInternetRequired: "Plan potřebuje internetové připojení pro první start ke stažení GeoLite2 Geolocation databáze." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Uložení relace, které byly zachovalé před předchozím spojením." webserverDisabled: "WebServer nebyl inicializován. (WebServer.DisableWebServer: true)" webserver: "Webserver běží na PORTU ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_DE.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_DE.yml index 59c41edf9..9e234a94e 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_DE.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_DE.yml @@ -257,6 +257,7 @@ html: noServers: "Keine Server in der Datenbank gefunden" noServersLong: 'It appears that Plan is not installed on any game servers or not connected to the same database. See wiki for Network tutorial.' noSpongeChunks: "Chunks unavailable on Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Dieser Wert ist eine Vorraussage, der sich auf, der auf den Spielern basiert" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">to" view: "Show a view" performQuery: "Perform Query!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Username can be up to 50 characters." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Klicke zum erweitern" comparing15days: "Vergleiche 15 Tage" comparing30daysAgo: "Vergleiche 30 Tage bis Jetzt" @@ -871,6 +877,9 @@ plugin: emptyIP: "IP in der server.properties ist leer & Alternative_IP ist nicht in Verwendung. Es werden falsche Links verwendet!" geoDisabled: "Geolocation wird nicht aufgezeichnet (Data.Geolocations: false)" geoInternetRequired: "Plan braucht einen Internetzugang um die GeoLite2 Geolocation Datenbank runterzuladen." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Storing sessions that were preserved before previous shutdown." webserverDisabled: "Webserver wurde nicht geladen. (WebServer.DisableWebServer: true)" webserver: "Webserver läuft auf PORT ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_EN.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_EN.yml index ce7df2bad..a9f4d45ca 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_EN.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_EN.yml @@ -257,6 +257,7 @@ html: noServers: "No servers found in the database" noServersLong: 'It appears that Plan is not installed on any game servers or not connected to the same database. See wiki for Network tutorial.' noSpongeChunks: "Chunks unavailable on Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "This value is a prediction based on previous players" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">to" view: "Show a view" performQuery: "Perform Query!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Username can be up to 50 characters." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Click to expand" comparing15days: "Comparing 15 days" comparing30daysAgo: "Comparing 30d ago to Now" @@ -871,6 +877,9 @@ plugin: emptyIP: "IP in server.properties is empty & Alternative_IP is not in use. Incorrect links might be given!" geoDisabled: "Geolocation gathering is not active. (Data.Geolocations: false)" geoInternetRequired: "Plan Requires internet access on first run to download GeoLite2 Geolocation database." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Storing sessions that were preserved before previous shutdown." webserverDisabled: "WebServer was not initialized. (WebServer.DisableWebServer: true)" webserver: "Webserver running on PORT ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_ES.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_ES.yml index 2ae84fa81..88fac8197 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_ES.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_ES.yml @@ -257,6 +257,7 @@ html: noServers: "Ningun servidor encontrado en la base de datos." noServersLong: 'It appears that Plan is not installed on any game servers or not connected to the same database. See wiki for Network tutorial.' noSpongeChunks: "Chunks no disponibles en Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Este valor es una predicción que viene dado por jugadores anteriores." error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">a" view: "Mostrar una vista" performQuery: "Perform Query!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "El nombre de usuario no puede superar los 50 caracteres." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Haz clic para expandir" comparing15days: "Comparando 15 dias" comparing30daysAgo: "Comparando desde hace 30d hasta ahora" @@ -871,6 +877,9 @@ plugin: emptyIP: "La IP en el server.properties esta vacía y AlternativeIP no está en uso. ¡Se darán los links incorrectos!" geoDisabled: "La recolección por Geolocalización no está activada. (Data.Geolocations: false)" geoInternetRequired: "Plan requiere acceso a internet la primera vez para descargar la base de datos de GeoLite2 Geolocation." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Almacenando sesiones que fueron preservadas antes de los apagados recientes." webserverDisabled: "El servidor web no se ha iniciado. (WebServer.DisableWebServer: true)" webserver: "El servidor web esta funcionando en el puerto ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_FI.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_FI.yml index e4094ec2e..6637a7e1d 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_FI.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_FI.yml @@ -257,6 +257,7 @@ html: noServers: "Palvelimia ei löytynyt tietokannasta" noServersLong: 'Vaikuttaa että Plan peli-palvelimia ei ole asennettu tai yhdistetty samaan tietokantaan. Katso wikiin lisätietoja varten.' noSpongeChunks: "Alueiden määrää ei voi laskea Sponge palvelimilla" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entiteetti tai Chunkki tietoja ei kerätä proxy palvelimilta, koska niillä ei ole peli-askel sykliä." predictedNewPlayerRetention: "Tämä arvo on arvattu ennustus edellisten pelaajien perusteella" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "Näkee Pelaajakunnan katsaus kaaviot" page_network_playerbase_overview: "Näkee Pelaajakunnan katsauksen numeroina" page_network_players: "Näkee Pelaajalista osion" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "Näkee Proxy palvelimen Lisäosat osion" page_network_retention: "Näkee Pelaajien pysyvyys osion" page_network_server_list: "Näkee listan palvelimista" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "Näkee Pelaajakunnan katsaus kaaviot" page_server_playerbase_overview: "Näkee Pelaajakunnan katsauksen numeroina" page_server_players: "Näkee Pelaajalista osion" + page_server_plugin_history: "See Plugin History" page_server_plugins: "Näkee palvelinten Lisäosat osiot" page_server_retention: "Näkee Pelaajien pysyvyys osion" page_server_sessions: "Näkee Istunnot osion" @@ -788,6 +791,7 @@ html: many: "käyttäen {number} palvelimen tietoja" single: "käyttäen yhden palvelimen" two: "käyttäen 2 palvelimen tietoja" + showFullQuery: "Show Full Query" to: ">tänne" view: "Näytä näkymä" performQuery: "Tee kysely!" @@ -820,6 +824,8 @@ html: success: "Käyttäjä rekisteröitiin onnistuneesti! Voit nyt kirjautua." usernameTip: "Käyttäjänimi voi olla enintään 50 merkkiä." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Klikkaa laajentaaksesi" comparing15days: "Verrataan 15 päivää" comparing30daysAgo: "Verrataan 30 päivää sitten nykyhetkeen" @@ -871,6 +877,9 @@ plugin: emptyIP: "IP server.properties tiedostossa on tyhjä & Alternative_IP ei ole käytössä. Linkit ovat virheellisiä!" geoDisabled: "Sijaintien keräys ei ole päällä. (Data.Geolocations: false)" geoInternetRequired: "Plan Vaatii internetin ensimmäisellä käynnistyskerralla GeoLite2 tietokannan lataamiseen." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Tallennetaan edellisellä sammutuskerralla talteenotettuja istuntoja." webserverDisabled: "Verkkopalvelinta ei käynnistetty. (WebServer.DisableWebServer: true)" webserver: "Verkkopalvelin pyörii PORTILLA ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_FR.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_FR.yml index 219689e7f..99c3b9d72 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_FR.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_FR.yml @@ -257,6 +257,7 @@ html: noServers: "Il n'y a pas de serveur dans la base de données." noServersLong: 'Il semblerait que Plan ne soit installé sur aucun des serveurs de jeu ou qu'il ne soit pas connecté à la même base de données. Voir wiki pour un tutoriel sur la mise en place d'un Réseau.' noSpongeChunks: "Chunks indisponibles sur Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Cette valeur est une prédiction basée sur les anciennes données du joueur." error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">à" view: "Visualiser une vue" performQuery: "Exécuter la Requête !" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Le Nom d'Utilisateur peut comporter jusqu'à 50 caractères." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Cliquez pour agrandir" comparing15days: "Comparaison des 15 derniers Jours" comparing30daysAgo: "Comparaison des 60 derniers Jours" @@ -871,6 +877,9 @@ plugin: emptyIP: "L'adresse IP située dans le fichier 'server.properties' est vide et l'option 'Alternative_IP' n'est pas utilisée. Attention, des liens incorrects seront donnés !" geoDisabled: "La Géolocalisation n'est pas active. (Data.Geolocations: false)" geoInternetRequired: "Plan nécessite un accès à Internet lors de sa première utilisation pour télécharger la base de données 'GeoLite2 Geolocation'." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Stockage des sessions ayant été préservées lors de l'arrêt précédent." webserverDisabled: "Le serveur Web n'a pas été initialisé. (WebServer.DisableWebServer: true)" webserver: "Le serveur Web communique à travers le port ${0} ( ${1} )." diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_IT.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_IT.yml index 0e6ff7d13..cfabc98c5 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_IT.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_IT.yml @@ -257,6 +257,7 @@ html: noServers: "Nessun server trovato in questo database" noServersLong: 'It appears that Plan is not installed on any game servers or not connected to the same database. See wiki for Network tutorial.' noSpongeChunks: "Chunks unavailable on Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Questo valore è una previsione basata sui giocatori precedenti" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">to" view: "Show a view" performQuery: "Perform Query!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Username can be up to 50 characters." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Clicca per espendere" comparing15days: "Comparazione di 15 giorni" comparing30daysAgo: "Comparazione di 30g fa a Ora" @@ -871,6 +877,9 @@ plugin: emptyIP: "L'IP in server.properties è vuoto e Alternative_IP non è in uso. Correggi queste informazioni!" geoDisabled: "Geolocalizazione non attiva. (Data.Geolocations: false)" geoInternetRequired: "Plan Richiede l'accesso a Internet al primo avvio per scaricare il database di geolocalizzazione GeoLite2." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Storing sessions that were preserved before previous shutdown." webserverDisabled: "WebServer non avviato. (WebServer.DisableWebServer: true)" webserver: "Webserver avviato sulla PORTA ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_JA.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_JA.yml index bc573a28c..e1c4262ca 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_JA.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_JA.yml @@ -257,6 +257,7 @@ html: noServers: "データーベース内に登録されたサーバーが見つかりません" noServersLong: 'プランがどのゲーム サーバーにもインストールされていないか、同じデータベースに接続されていないようです。ネットワーク チュートリアルについては、Wikiを参考にしてください' noSpongeChunks: "Spongeではチャンクを利用できません" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS、エンティティ、またはチャンクデータは、ゲーム ティックループがないため、プロキシサーバーから収集されません" predictedNewPlayerRetention: "これは以前のプレーヤーから基づいた予測値です" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "プレイヤー層のグラフを表示" page_network_playerbase_overview: "プレイヤー層の概要番号を表示" page_network_players: "プレイヤーリストタブを表示" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "プロキシーのプラグインタブを表示" page_network_retention: "プレイヤー維持のタブを表示" page_network_server_list: "サーバーリストを表示" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "プレイヤー層概要グラフを表示" page_server_playerbase_overview: "プレイヤー層概要番号を表示" page_server_players: "プレイヤーリストタブを表示" + page_server_plugin_history: "See Plugin History" page_server_plugins: "サーバーのプラグインタブを表示" page_server_retention: "プレイヤーの維持タブを表示" page_server_sessions: "セッションタブを表示" @@ -788,6 +791,7 @@ html: many: "{number}つのサーバーのデータを使用しています" single: "1つのサーバーのデータを使用しています" two: "2つのサーバーのデータを使用しています" + showFullQuery: "Show Full Query" to: ">に" view: "ビューを表示" performQuery: "クエリを実行!" @@ -820,6 +824,8 @@ html: success: "新規ユーザー登録が完了しました!ログインできるようになりました。" usernameTip: "ユーザー名は50文字以内で指定します" text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "クリックして展開" comparing15days: "直近15日との比較" comparing30daysAgo: "30日前との比較" @@ -871,6 +877,9 @@ plugin: emptyIP: "server.propertiesの設定で、IPの項目が設定されておらずAlternative IPが使用されていません。そのため誤ったリンクが表示されます!" geoDisabled: "位置情報サービスが有効ではありません。 (Data.Geolocations: false)" geoInternetRequired: "「Plan」は初回起動時、「GeoLite2」の位置情報データベースをダウンロードするためインターネットアクセスが必要です" + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "前回のシャットダウン時に、保存されていたセッションを保存します" webserverDisabled: "Webサーバーの初期化に失敗しました (WebServer.DisableWebServer: true)" webserver: "Webサーバーは次のポートで実行されています: ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_KO.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_KO.yml index 72086c635..b8c195c90 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_KO.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_KO.yml @@ -257,6 +257,7 @@ html: noServers: "데이터베이스에 서버가 없습니다." noServersLong: 'It appears that Plan is not installed on any game servers or not connected to the same database. See wiki for Network tutorial.' noSpongeChunks: "Chunks unavailable on Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "이 값은 기존 플레이어를 기반으로 한 예측입니다." error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">to" view: "Show a view" performQuery: "Perform Query!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Username can be up to 50 characters." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "확장하려면 클릭" comparing15days: "지난 15일 비교" comparing30daysAgo: "지난 30일 비교" @@ -871,6 +877,9 @@ plugin: emptyIP: "server.properties의 IP가 비어 있고 대체 IP가 사용되지 않습니다. 잘못된 링크가 제공 될 수 있습니다!" geoDisabled: "위치 정보 수집이 활성화되지 않았습니다. (Data.Geolocations : false)" geoInternetRequired: "Plan GeoLite2 Geolocation 데이터베이스를 다운로드하려면 처음 실행할 때 인터넷 액세스가 필요합니다." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Storing sessions that were preserved before previous shutdown." webserverDisabled: "웹 서버가 초기화되지 않았습니다. (WebServer.DisableWebServer : true)" webserver: "해당 포트에서 실행되는 웹 서버 ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_NL.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_NL.yml index b1b0ee703..0eacbea89 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_NL.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_NL.yml @@ -257,6 +257,7 @@ html: noServers: "Er zijn geen servers gevonden in de database" noServersLong: 'Het lijkt erop dat Plan op geen enkele gameserver is geïnstalleerd of niet is verbonden met dezelfde database. Zie de wiki voor een netwerkhandleiding.' noSpongeChunks: "Chunks niet beschikbaar op Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Deze waarde is een voorspelling op basis van eerdere spelers" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">naar" view: "Toon een weergave" performQuery: "Query Uitvoeren!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Gebruikersnaam mag maximaal 50 tekens bevatten." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Klik om uit te breiden" comparing15days: "15 dagen vergelijken" comparing30daysAgo: "30 dagen tot nu vergelijken" @@ -871,6 +877,9 @@ plugin: emptyIP: "IP in server.properties is leeg en de Alternative_IP-instelling is niet in gebruik. Er kunnen onjuiste links worden gegeven!" geoDisabled: "Geolocatie verzamelen is niet actief. (Data.Geolocations: false)" geoInternetRequired: "Plan Vereist internettoegang bij de eerste run om de GeoLite2 Geolocation-database te downloaden." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Sessies opslaan die zijn bewaard vóór de vorige afsluiting." webserverDisabled: "Webserver is niet geïnitialiseerd. (WebServer.DisableWebServer: true)" webserver: "Webserver draait op PORT ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_PT_BR.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_PT_BR.yml index 84e3fcb00..a7c388333 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_PT_BR.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_PT_BR.yml @@ -257,6 +257,7 @@ html: noServers: "No servers found in the database" noServersLong: 'It appears that Plan is not installed on any game servers or not connected to the same database. See wiki for Network tutorial.' noSpongeChunks: "Chunks unavailable on Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "This value is a prediction based on previous players" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">to" view: "Show a view" performQuery: "Perform Query!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Username can be up to 50 characters." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Click to expand" comparing15days: "Comparing 15 days" comparing30daysAgo: "Comparing 30d ago to Now" @@ -871,6 +877,9 @@ plugin: emptyIP: "O IP no server.properties está vazio & o IP alternativo não está sendo usado. Os dados informados estão incorretos!" geoDisabled: "A coleta de geolocalização está desativada. (Data.Geolocations: false)" geoInternetRequired: "O Plan requer acesso à internet na primeira execução para baixar o banco de dados de geolocalização do GeoLite2." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Storing sessions that were preserved before previous shutdown." webserverDisabled: "O servidor web não foi inicializado. (WebServer.DisableWebServer: true)" webserver: "O servidor web está rodando na PORTA ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_RU.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_RU.yml index 6c0f23a9e..bc68295e0 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_RU.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_RU.yml @@ -257,6 +257,7 @@ html: noServers: "В базе данных не найдено ни одного сервера" noServersLong: 'Похоже, что Plan не установлен ни на одном игровом сервере или не подключен к той же базе данных. Смотрите вики для помощи.' noSpongeChunks: "Чанки не доступны на Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Это значение является прогнозом на основе предыдущих игроков" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">в" view: "Показывать результат" performQuery: "Выполнить запрос!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Ник должен быть не длиннее 50 символов." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Нажмите, чтобы развернуть" comparing15days: "Сравнение 15 дней" comparing30daysAgo: "Сравнение 30 дней назад и сейчас" @@ -871,6 +877,9 @@ plugin: emptyIP: "IP в server.properties пуст, а Alternative_IP не используется. Могут быть даны неверные ссылки!" geoDisabled: "Геолокационный сбор не активен. (Data.Geolocations: false)" geoInternetRequired: "Plan'у Требуется доступ в Интернет при первом запуске, чтобы загрузить базу геолокации GeoLite2." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Хранение сеансов, которые были сохранены до предыдущего выключения." webserverDisabled: "Веб-сервер не был инициализирован. (WebServer.DisableWebServer: true)" webserver: "Веб-сервер работает на порте ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_TR.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_TR.yml index 5417751b0..953446c61 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_TR.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_TR.yml @@ -257,6 +257,7 @@ html: noServers: "Veritabanında sunucu bulunamadı" noServersLong: 'Plan'ın herhangi bir oyun sunucusuna yüklenmediği veya aynı veritabanına bağlı olmadığı anlaşılıyor. Ağ eğitimi için wiki 'ye bakın.' noSpongeChunks: "Chunklar Spongeda mevcut değil" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "Bu değer, önceki oyunculara dayalı bir tahmindir" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">a" view: "Bir görünüm göster" performQuery: "Sorgu Gerçekleştirin!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "Kullanıcı adı 50 karaktere kadar olabilir." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Genişletmek için tıklayın" comparing15days: "15 gün karşılaştırılıyor" comparing30daysAgo: "30 gün öncesiyle şimdi karşılaştırılıyor." @@ -871,6 +877,9 @@ plugin: emptyIP: "server.properties IP adresi kısmı boş & AlternatifIP kullanılmıyor. Bu yüzden yanlış linkler verilecektir!" geoDisabled: "Coğrafi konum toplama etkin değil. (Data.Geolocations: false)" geoInternetRequired: "Plan GeoLite2 Geolocation veritabanını indirmek için ilk çalıştırmada internet erişimi gerektir." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Önceki kapatmadan önce korunan oturumları saklama." webserverDisabled: "WebServer başlatılmadı. (WebServer.DisableWebServer: true)" webserver: "Webserver Bu port üzerinden çalışıyor ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_UK.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_UK.yml index 6e807e06d..e6a0ab20a 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_UK.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_UK.yml @@ -257,6 +257,7 @@ html: noServers: "У базі даних не знайдено жодного сервера" noServersLong: 'Схоже, що Plan не встановлено на жодному ігровому сервері або не підключено до тієї самої бази даних. Дивіться вікі для допомоги.' noSpongeChunks: "Чанки не доступні на Sponge" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "Дані TPS, Entity або Chunk не збираються з проксі-серверів, оскільки вони не мають ігрового циклу." predictedNewPlayerRetention: "Це значення є прогнозом на основі попередніх гравців" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "з використанням даних {number} серверів" single: "з використанням даних 1 сервера" two: "з використанням даних 2 серверів" + showFullQuery: "Show Full Query" to: ">в" view: "Показувати результат" performQuery: "Виконати запит!" @@ -820,6 +824,8 @@ html: success: "Ви успішно зареєстрували нового користувача! Тепер ви можете увійти в систему." usernameTip: "Нікнейм має бути не довшим за 50 символів." text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "Натисніть, щоб розгорнути" comparing15days: "Порівняння 15 днів" comparing30daysAgo: "Порівняння 30 днів тому і зараз" @@ -871,6 +877,9 @@ plugin: emptyIP: "IP в server.properties пустий, а Alternative_IP не використовується. Можуть бути дані невірні посилання!" geoDisabled: "Геолокаційний збір не активний. (Data.Geolocations: false)" geoInternetRequired: "Plan'у Потрібен доступ в Інтернет під час першого запуску, щоб завантажити базу геолокації GeoLite2." + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "Зберігання сеансів, які були збережені до попереднього вимкнення." webserverDisabled: "Веб-сервер не було ініціалізовано. (WebServer.DisableWebServer: true)" webserver: "Веб-сервер працює на порті ${0} ( ${1} )" diff --git a/Plan/src/main/resources/assets/plan/plan/locale/locale_ZH_TW.yml b/Plan/src/main/resources/assets/plan/plan/locale/locale_ZH_TW.yml index 12f8f2128..0596fc9e4 100644 --- a/Plan/src/main/resources/assets/plan/plan/locale/locale_ZH_TW.yml +++ b/Plan/src/main/resources/assets/plan/plan/locale/locale_ZH_TW.yml @@ -257,6 +257,7 @@ html: noServers: "資料庫中找不到伺服器" noServersLong: '看起來 Plan 沒有安裝在任何遊戲伺服器上或者遊戲伺服器未連接到相同的資料庫。 群組網路教程請參見:wiki' noSpongeChunks: "區塊資料在 Sponge 伺服端無法使用" + noUptimeCalculation: "Server is offline, or has never restarted with Plan installed." performanceNoGameServers: "TPS, Entity or Chunk data is not gathered from proxy servers since they don't have game tick loop." predictedNewPlayerRetention: "這個數值是基於之前的玩家資料預測的" error: @@ -668,6 +669,7 @@ html: page_network_playerbase_graphs: "See Playerbase Overview graphs" page_network_playerbase_overview: "See Playerbase Overview numbers" page_network_players: "See Player list -tab" + page_network_plugin_history: "See Plugin History across the network" page_network_plugins: "See Plugins tab of Proxy" page_network_retention: "See Player Retention -tab" page_network_server_list: "See list of servers" @@ -710,6 +712,7 @@ html: page_server_playerbase_graphs: "See Playerbase Overview graphs" page_server_playerbase_overview: "See Playerbase Overview numbers" page_server_players: "See Player list -tab" + page_server_plugin_history: "See Plugin History" page_server_plugins: "See Plugins -tabs of servers" page_server_retention: "See Player Retention -tab" page_server_sessions: "See Sessions tab" @@ -788,6 +791,7 @@ html: many: "using data of {number} servers" single: "using data of 1 server" two: "using data of 2 servers" + showFullQuery: "Show Full Query" to: ">到 " view: "日期範圍" performQuery: "執行查詢!" @@ -820,6 +824,8 @@ html: success: "Registered a new user successfully! You can now login." usernameTip: "使用者名稱最多可以包含 50 個字符。" text: + click: "Click for more" + clickAndDrag: "Click and Drag for more" clickToExpand: "點擊展開" comparing15days: "對比 15 天的情況" comparing30daysAgo: "對比 30 天前和現在的情況" @@ -871,6 +877,9 @@ plugin: emptyIP: "server.properties 中的 IP 為空且未使用備用 IP。這可能會導致位址出錯!" geoDisabled: "已關閉地理位置收集。(Data.Geolocations: false)" geoInternetRequired: "Plan 需要在首次執行時連接網路以下載 GeoLite2 地理位置資料庫。" + proxyAddress: "Proxy server detected in the database - Proxy Webserver address is '${0}'." + proxyDisabledWebserver: "Disabling Webserver on this server - You can override this behavior by setting '${0}' to false." + settingChange: "Note: Set '${0}' to ${1}" storeSessions: "正在儲存之前關機前留下的會話。" webserverDisabled: "網頁伺服器未初始化。(WebServer.DisableWebServer: true)" webserver: "網頁伺服器已在 ${0} ( ${1} ) 端口上執行" diff --git a/react/dashboard/dashboard/package.json b/react/dashboard/dashboard/package.json index 04cf3dc29..3d9109038 100644 --- a/react/dashboard/dashboard/package.json +++ b/react/dashboard/dashboard/package.json @@ -12,17 +12,19 @@ "@fortawesome/free-regular-svg-icons": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.2", "@fortawesome/react-fontawesome": "^0.2.0", - "@fullcalendar/bootstrap": "^5.11.5", - "@fullcalendar/daygrid": "^5.11.5", - "@fullcalendar/react": "^5.11.5", + "@fullcalendar/bootstrap": "^6.1.9", + "@fullcalendar/core": "^6.1.9", + "@fullcalendar/daygrid": "^6.1.9", + "@fullcalendar/interaction": "^6.1.9", + "@fullcalendar/react": "^6.1.9", "@highcharts/map-collection": "^2.1.0", - "@testing-library/jest-dom": "^6.1.3", + "@testing-library/jest-dom": "^6.1.4", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.5.1", "axios": "^1.5.1", "bootstrap": "^5.3.2", "highcharts": "^10.3.3", - "i18next": "^23.5.1", + "i18next": "^23.6.0", "i18next-chained-backend": "^4.5.0", "i18next-http-backend": "^2.2.2", "i18next-localstorage-backend": "^4.2.0", @@ -32,11 +34,11 @@ "react-bootstrap": "^2.9.0", "react-bootstrap-range-slider": "^3.0.8", "react-dom": "^18.2.0", - "react-i18next": "^13.2.2", + "react-i18next": "^13.3.1", "react-mcjsonchat": "^1.0.0", "react-router-dom": "6", "react-scripts": "5.0.1", - "sass": "^1.69.0", + "sass": "^1.69.4", "source-map-explorer": "^2.5.2", "swagger-ui": "^5.9.0", "web-vitals": "^3.0.2" diff --git a/react/dashboard/dashboard/src/components/Datapoint.js b/react/dashboard/dashboard/src/components/Datapoint.js index c84b37658..69404f6da 100644 --- a/react/dashboard/dashboard/src/components/Datapoint.js +++ b/react/dashboard/dashboard/src/components/Datapoint.js @@ -3,14 +3,24 @@ import React from "react"; import End from "./layout/End"; import {useTranslation} from "react-i18next"; +const getExtraLabel = (t, valueLabel) => { + if (typeof valueLabel === 'string') { + return ` (${t(valueLabel)})`; + } else if (valueLabel?.props) { + return valueLabel; + } else { + return ''; + } +} + const Datapoint = ({icon, color, name, value, valueLabel, bold, boldTitle, title, trend}) => { const {t} = useTranslation(); if (value === undefined && valueLabel === undefined) return <>; - const isTranslatable = typeof value === 'string' && (value.startsWith('html') || value.startsWith('plugin')); + const isTranslatable = typeof value === 'string' && (value.startsWith('html') || value.startsWith('plugin') || value.startsWith('generic')); const translatedValue = isTranslatable ? t(value) : value; const displayedValue = bold ? {translatedValue} : translatedValue; - const extraLabel = typeof valueLabel === 'string' ? ` (${t(valueLabel)})` : ''; + const extraLabel = getExtraLabel(t, valueLabel); const colorClass = color?.startsWith("col-") ? color : "col-" + color; return (

diff --git a/react/dashboard/dashboard/src/components/calendar/ServerCalendar.js b/react/dashboard/dashboard/src/components/calendar/ServerCalendar.js index 9fb98a0d6..8da2a0c4d 100644 --- a/react/dashboard/dashboard/src/components/calendar/ServerCalendar.js +++ b/react/dashboard/dashboard/src/components/calendar/ServerCalendar.js @@ -1,12 +1,25 @@ import React from "react"; import FullCalendar from '@fullcalendar/react' import dayGridPlugin from '@fullcalendar/daygrid' +import interactionPlugin from '@fullcalendar/interaction' +import {useTranslation} from "react-i18next"; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; +import {faHandPointer} from "@fortawesome/free-regular-svg-icons"; + +const ServerCalendar = ({series, firstDay, onSelect}) => { + const {t} = useTranslation(); + + const explainerStyle = { + position: "absolute", + top: "0.5rem", + right: "1rem" + }; -const ServerCalendar = ({series, firstDay}) => { return (

+

{t('html.text.clickAndDrag')}

{ center: '', right: 'dayGridMonth dayGridWeek dayGridDay today prev next' }} + editable={Boolean(onSelect)} + selectable={Boolean(onSelect)} + select={onSelect} + unselectAuto={true} events={(_fetchInfo, successCallback) => successCallback(series)} />
diff --git a/react/dashboard/dashboard/src/components/cards/common/GeolocationsCard.js b/react/dashboard/dashboard/src/components/cards/common/GeolocationsCard.js index 5c2a781e1..032e7dcad 100644 --- a/react/dashboard/dashboard/src/components/cards/common/GeolocationsCard.js +++ b/react/dashboard/dashboard/src/components/cards/common/GeolocationsCard.js @@ -1,12 +1,18 @@ import {useTranslation} from "react-i18next"; import {Card, Col, Dropdown} from "react-bootstrap"; -import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome"; -import React, {useState} from "react"; +import {FontAwesomeIcon, FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome"; +import React, {useCallback, useState} from "react"; import {faExclamationTriangle, faGlobe, faLayerGroup} from "@fortawesome/free-solid-svg-icons"; import GeolocationBarGraph from "../../graphs/GeolocationBarGraph"; import GeolocationWorldMap, {ProjectionOptions} from "../../graphs/GeolocationWorldMap"; import {CardLoader} from "../../navigation/Loader"; import ExtendableRow from "../../layout/extension/ExtendableRow"; +import Highcharts from "highcharts/highstock"; +import {postQuery} from "../../../service/queryService"; +import {useMetadata} from "../../../hooks/metadataHook"; +import QueryPlayerListModal from "../../modal/QueryPlayerListModal"; +import {faHandPointer} from "@fortawesome/free-regular-svg-icons"; +import CardHeader from "../CardHeader"; const ProjectionDropDown = ({projection, setProjection}) => { const {t} = useTranslation(); @@ -14,7 +20,7 @@ const ProjectionDropDown = ({projection, setProjection}) => { const projectionOptions = Object.values(ProjectionOptions); return ( - {t(projection)} @@ -32,10 +38,47 @@ const ProjectionDropDown = ({projection, setProjection}) => { ) } -const GeolocationsCard = ({data}) => { +const GeolocationsCard = ({identifier, data}) => { const {t} = useTranslation(); + const {networkMetadata} = useMetadata(); const [projection, setProjection] = useState(ProjectionOptions.MILLER); + const [modalOpen, setModalOpen] = useState(false); + const [queryData, setQueryData] = useState(undefined); + const [country, setCountry] = useState(undefined); + + const closeModal = useCallback(() => { + setModalOpen(false); + }, [setModalOpen]); + + const onClickCountry = useCallback(async selectionInfo => { + const selectedCountry = selectionInfo?.point['iso-a3']; + if (!selectedCountry) return; + const end = Highcharts.dateFormat('%d/%m/%Y', Date.now()); + const query = { + filters: [{ + kind: "geolocations", + parameters: { + selected: `["${selectedCountry}"]` + } + }], + view: { + afterDate: "01/01/1970", afterTime: "00:00", + beforeDate: end, beforeTime: "00:00", + servers: networkMetadata?.servers.filter(server => server.serverUUID === identifier) || [] + } + } + setQueryData(undefined); + setCountry(undefined); + setModalOpen(true); + const data = await postQuery(query); + const loaded = data?.data; + if (loaded) { + setQueryData(loaded); + setCountry(selectionInfo.point.name); + } + }, [setQueryData, setModalOpen, networkMetadata, identifier, setCountry]); + if (!data) return if (!data?.geolocations_enabled) { @@ -48,12 +91,14 @@ const GeolocationsCard = ({data}) => { return ( - -
- {t('html.label.geolocations')} -
+ + -
+

+ {t('html.text.click')} +

+ @@ -61,7 +106,7 @@ const GeolocationsCard = ({data}) => { + projection={projection} onClickCountry={onClickCountry}/> diff --git a/react/dashboard/dashboard/src/components/cards/common/PingTableCard.js b/react/dashboard/dashboard/src/components/cards/common/PingTableCard.js index d91485d63..8fe82e506 100644 --- a/react/dashboard/dashboard/src/components/cards/common/PingTableCard.js +++ b/react/dashboard/dashboard/src/components/cards/common/PingTableCard.js @@ -3,12 +3,14 @@ import {Card} from "react-bootstrap"; import CardHeader from "../CardHeader"; import {faWifi} from "@fortawesome/free-solid-svg-icons"; import PingTable from "../../table/PingTable"; +import {ChartLoader} from "../../navigation/Loader"; const PingTableCard = ({data}) => { return ( - + {data && } + {!data && } ) }; diff --git a/react/dashboard/dashboard/src/components/cards/common/PlayerListCard.js b/react/dashboard/dashboard/src/components/cards/common/PlayerListCard.js index 2724baeeb..34eeea8e0 100644 --- a/react/dashboard/dashboard/src/components/cards/common/PlayerListCard.js +++ b/react/dashboard/dashboard/src/components/cards/common/PlayerListCard.js @@ -2,7 +2,7 @@ import {useTranslation} from "react-i18next"; import {Card} from "react-bootstrap"; import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome"; import React, {useCallback, useEffect, useState} from "react"; -import {faCheck, faGlobe, faUser, faUserPlus, faUsers} from "@fortawesome/free-solid-svg-icons"; +import {faCheck, faGlobe, faSignal, faUser, faUserPlus, faUsers} from "@fortawesome/free-solid-svg-icons"; import DataTablesTable from "../../table/DataTablesTable"; import {CardLoader} from "../../navigation/Loader"; import {Link} from "react-router-dom"; @@ -11,6 +11,8 @@ import FormattedDate from "../../text/FormattedDate"; import FormattedTime from "../../text/FormattedTime"; import ExtensionIcon from "../../extensions/ExtensionIcon"; import {ExtensionValueTableCell} from "../../extensions/ExtensionCard"; +import {usePreferences} from "../../../hooks/preferencesHook"; +import {formatDecimals} from "../../../util/formatters"; const getActivityGroup = value => { const VERY_ACTIVE = 3.75; @@ -30,8 +32,10 @@ const getActivityGroup = value => { } } -const PlayerListCard = ({data, title}) => { +const PlayerListCard = ({data, title, justList, orderBy}) => { const {t} = useTranslation(); + const {preferencesLoaded, decimalFormat} = usePreferences(); + const [options, setOptions] = useState(undefined); useEffect(() => { @@ -58,6 +62,15 @@ const PlayerListCard = ({data, title}) => { }, { title: <> {t('html.label.country')}, data: "country" + }, { + title: <> {t('html.label.averagePing')}, + data: {_: "pingAverage", display: "pingAverageFormatted"} + }, { + title: <> {t('html.label.bestPing')}, + data: {_: "pingMin", display: "pingMinFormatted"} + }, { + title: <> {t('html.label.worstPing')}, + data: {_: "pingMax", display: "pingMaxFormatted"} }]; columns.push(...data.extensionDescriptors.map(descriptor => { @@ -73,7 +86,7 @@ const PlayerListCard = ({data, title}) => { uuid: player.playerUUID, link: {player.playerName}, activityIndex: player.activityIndex, - activityIndexAndGroup: player.activityIndex + " (" + t(getActivityGroup(player.activityIndex)) + ")", + activityIndexAndGroup: formatDecimals(player.activityIndex, decimalFormat) + " (" + t(getActivityGroup(player.activityIndex)) + ")", activePlaytime: player.playtimeActive, activePlaytimeFormatted: , sessions: player.sessionCount, @@ -81,7 +94,13 @@ const PlayerListCard = ({data, title}) => { registeredFormatted: , lastSeen: player.lastSeen, lastSeenFormatted: , - country: player.country + country: player.country, + pingAverage: player.pingAverage, + pingAverageFormatted: formatDecimals(player.pingAverage, decimalFormat) + "ms", + pingMax: player.pingMax, + pingMaxFormatted: player.pingMax + "ms", + pingMin: player.pingMin, + pingMinFormatted: player.pingMin + "ms" }; data.extensionDescriptors.forEach(descriptor => { row[descriptor.name] = ; @@ -95,15 +114,22 @@ const PlayerListCard = ({data, title}) => { deferRender: true, columns: columns, data: rows, - order: [[5, "desc"]] + order: [[orderBy !== undefined ? orderBy : 5, "desc"]] }); - }, [data, t]); + }, [data, orderBy, t, decimalFormat]); const rowKeyFunction = useCallback((row, column) => { return row.uuid + "-" + (column ? JSON.stringify(column.data) : ''); }, []); - if (!options) return + if (!preferencesLoaded) return <>; + if (!options) return ; + + if (justList) { + return ( + + ); + } return ( diff --git a/react/dashboard/dashboard/src/components/cards/network/QuickViewDataCard.js b/react/dashboard/dashboard/src/components/cards/network/QuickViewDataCard.js index a25e023d0..0ad7c900c 100644 --- a/react/dashboard/dashboard/src/components/cards/network/QuickViewDataCard.js +++ b/react/dashboard/dashboard/src/components/cards/network/QuickViewDataCard.js @@ -11,6 +11,7 @@ import { } from "@fortawesome/free-solid-svg-icons"; import {useTranslation} from "react-i18next"; import Datapoint from "../../Datapoint"; +import CurrentUptime from "../../datapoint/CurrentUptime"; const QuickViewDataCard = ({server}) => { const {t} = useTranslation() @@ -19,8 +20,7 @@ const QuickViewDataCard = ({server}) => { - + diff --git a/react/dashboard/dashboard/src/components/cards/player/PlayerOverviewCard.js b/react/dashboard/dashboard/src/components/cards/player/PlayerOverviewCard.js index 17b7497a2..e796b8ecc 100644 --- a/react/dashboard/dashboard/src/components/cards/player/PlayerOverviewCard.js +++ b/react/dashboard/dashboard/src/components/cards/player/PlayerOverviewCard.js @@ -115,7 +115,7 @@ const PlayerOverviewCard = ({player}) => { {t('html.label.activityIndex')} - } value={player.info.activity_index} bold diff --git a/react/dashboard/dashboard/src/components/cards/server/graphs/NetworkOnlineActivityGraphsCard.js b/react/dashboard/dashboard/src/components/cards/server/graphs/NetworkOnlineActivityGraphsCard.js index 6f9c64034..57e96c7ff 100644 --- a/react/dashboard/dashboard/src/components/cards/server/graphs/NetworkOnlineActivityGraphsCard.js +++ b/react/dashboard/dashboard/src/components/cards/server/graphs/NetworkOnlineActivityGraphsCard.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useCallback, useState} from 'react'; import {useTranslation} from "react-i18next"; import {Card} from "react-bootstrap"; import CardTabs from "../../../CardTabs"; @@ -19,6 +19,9 @@ import StackedPlayersOnlineGraph from "../../../graphs/StackedPlayersOnlineGraph import {useAuth} from "../../../../hooks/authenticationHook"; import {faCalendar} from "@fortawesome/free-regular-svg-icons"; import ServerCalendar from "../../../calendar/ServerCalendar"; +import {postQuery} from "../../../../service/queryService"; +import Highcharts from "highcharts/highstock"; +import QueryPlayerListModal from "../../../modal/QueryPlayerListModal"; const SingleProxyPlayersOnlineGraph = ({serverUUID}) => { const {data, loadingError} = useDataRequest(fetchPlayersOnlineGraph, [serverUUID]); @@ -69,13 +72,47 @@ const HourByHourTab = () => { } const NetworkCalendarTab = () => { + const {data, loadingError} = useDataRequest(fetchNetworkCalendarGraph, []); + const [modalOpen, setModalOpen] = useState(false); + const [queryData, setQueryData] = useState(undefined); - const {data, loadingError} = useDataRequest(fetchNetworkCalendarGraph, []) + const closeModal = useCallback(() => { + setModalOpen(false); + }, [setModalOpen]); + + const onSelect = useCallback(async selectionInfo => { + const start = Highcharts.dateFormat('%d/%m/%Y', selectionInfo.start); + const end = Highcharts.dateFormat('%d/%m/%Y', selectionInfo.end); + const query = { + filters: [{ + kind: "playedBetween", + parameters: { + afterDate: start, afterTime: "00:00", + beforeDate: end, beforeTime: "00:00" + } + }], + view: { + afterDate: start, afterTime: "00:00", + beforeDate: end, beforeTime: "00:00", + servers: [] + } + } + setQueryData(undefined); + setModalOpen(true); + const data = await postQuery(query); + const loaded = data?.data; + if (loaded) { + setQueryData(loaded); + } + }, [setQueryData, setModalOpen]); if (loadingError) return if (!data) return ; - return + return <> + + + } const NetworkOnlineActivityGraphsCard = () => { diff --git a/react/dashboard/dashboard/src/components/cards/server/graphs/OnlineActivityGraphsCard.js b/react/dashboard/dashboard/src/components/cards/server/graphs/OnlineActivityGraphsCard.js index 533446e90..50efe54e9 100644 --- a/react/dashboard/dashboard/src/components/cards/server/graphs/OnlineActivityGraphsCard.js +++ b/react/dashboard/dashboard/src/components/cards/server/graphs/OnlineActivityGraphsCard.js @@ -13,11 +13,15 @@ import {Card} from "react-bootstrap"; import CardTabs from "../../../CardTabs"; import {faBraille, faChartArea} from "@fortawesome/free-solid-svg-icons"; import {faCalendar} from "@fortawesome/free-regular-svg-icons"; -import React from "react"; +import React, {useCallback, useState} from "react"; import TimeByTimeGraph from "../../../graphs/TimeByTimeGraph"; import ServerCalendar from "../../../calendar/ServerCalendar"; import {ChartLoader} from "../../../navigation/Loader"; import {useAuth} from "../../../../hooks/authenticationHook"; +import Highcharts from "highcharts/highstock"; +import {postQuery} from "../../../../service/queryService"; +import QueryPlayerListModal from "../../../modal/QueryPlayerListModal"; +import {useMetadata} from "../../../../hooks/metadataHook"; const DayByDayTab = () => { const {identifier} = useParams(); @@ -38,18 +42,54 @@ const HourByHourTab = () => { if (loadingError) return if (!data) return ; - return + return } const ServerCalendarTab = () => { const {identifier} = useParams(); + const {data, loadingError} = useDataRequest(fetchServerCalendarGraph, [identifier]); + const {networkMetadata} = useMetadata(); - const {data, loadingError} = useDataRequest(fetchServerCalendarGraph, [identifier]) + const [modalOpen, setModalOpen] = useState(false); + const [queryData, setQueryData] = useState(undefined); + + const closeModal = useCallback(() => { + setModalOpen(false); + }, [setModalOpen]); + + const onSelect = useCallback(async selectionInfo => { + const start = Highcharts.dateFormat('%d/%m/%Y', selectionInfo.start); + const end = Highcharts.dateFormat('%d/%m/%Y', selectionInfo.end); + const query = { + filters: [{ + kind: "playedBetween", + parameters: { + afterDate: start, afterTime: "00:00", + beforeDate: end, beforeTime: "00:00" + } + }], + view: { + afterDate: start, afterTime: "00:00", + beforeDate: end, beforeTime: "00:00", + servers: networkMetadata?.servers.filter(server => server.serverUUID === identifier) || [] + } + } + setQueryData(undefined); + setModalOpen(true); + const data = await postQuery(query); + const loaded = data?.data; + if (loaded) { + setQueryData(loaded); + } + }, [setQueryData, setModalOpen, networkMetadata, identifier]); if (loadingError) return if (!data) return ; - return + return <> + + + } const PunchCardTab = () => { diff --git a/react/dashboard/dashboard/src/components/cards/server/values/ServerAsNumbersCard.js b/react/dashboard/dashboard/src/components/cards/server/values/ServerAsNumbersCard.js index af3b1b181..e4a88b682 100644 --- a/react/dashboard/dashboard/src/components/cards/server/values/ServerAsNumbersCard.js +++ b/react/dashboard/dashboard/src/components/cards/server/values/ServerAsNumbersCard.js @@ -1,21 +1,14 @@ import {useTranslation} from "react-i18next"; import {Card} from "react-bootstrap"; import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome"; -import { - faBookOpen, - faChartLine, - faCrosshairs, - faPowerOff, - faSkull, - faUser, - faUsers -} from "@fortawesome/free-solid-svg-icons"; +import {faBookOpen, faChartLine, faCrosshairs, faSkull, faUser, faUsers} from "@fortawesome/free-solid-svg-icons"; import Datapoint from "../../../Datapoint"; import {faCalendarCheck, faClock} from "@fortawesome/free-regular-svg-icons"; import React from "react"; import {CardLoader} from "../../../navigation/Loader"; import ExtendableCardBody from "../../../layout/extension/ExtendableCardBody"; import {useMetadata} from "../../../../hooks/metadataHook"; +import CurrentUptime from "../../../datapoint/CurrentUptime"; const ServerAsNumbersCard = ({data}) => { const {t} = useTranslation(); @@ -34,9 +27,7 @@ const ServerAsNumbersCard = ({data}) => { - +
{ - {data.player_kills &&
} + {data.player_kills !== undefined &&
} diff --git a/react/dashboard/dashboard/src/components/datapoint/CurrentUptime.js b/react/dashboard/dashboard/src/components/datapoint/CurrentUptime.js new file mode 100644 index 000000000..0c69693e8 --- /dev/null +++ b/react/dashboard/dashboard/src/components/datapoint/CurrentUptime.js @@ -0,0 +1,22 @@ +import React from 'react'; +import {useTranslation} from "react-i18next"; +import {faPowerOff} from "@fortawesome/free-solid-svg-icons"; +import {faQuestionCircle} from "@fortawesome/free-regular-svg-icons"; +import Datapoint from "../Datapoint"; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; + +const CurrentUptime = ({uptime}) => { + const {t} = useTranslation(); + + const infoBubble = uptime === 'plugin.generic.unavailable' + ? + : undefined; + + return ( + + ) +}; + +export default CurrentUptime \ No newline at end of file diff --git a/react/dashboard/dashboard/src/components/extensions/ExtensionTable.js b/react/dashboard/dashboard/src/components/extensions/ExtensionTable.js index f941ff0a0..ced5e8cd4 100644 --- a/react/dashboard/dashboard/src/components/extensions/ExtensionTable.js +++ b/react/dashboard/dashboard/src/components/extensions/ExtensionTable.js @@ -1,15 +1,21 @@ -import React, {useCallback, useState} from 'react'; -import {useTheme} from "../../hooks/themeHook"; -import {useTranslation} from "react-i18next"; +import React, {useState} from 'react'; import ExtensionIcon from "./ExtensionIcon"; import DataTablesTable from "../table/DataTablesTable"; -import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; -import {faSort, faSortDown, faSortUp} from "@fortawesome/free-solid-svg-icons"; import ColoredText from "../text/ColoredText"; +import {baseAddress} from "../../service/backendConfiguration"; const ExtensionDataTable = ({table}) => { const [id] = useState("extension-table-" + new Date().getTime() + "-" + (Math.floor(Math.random() * 100000))); + const mapToCell = (value, j) => { + if (String(value).startsWith("; + } + return + }; + const data = { columns: table.table.columns.map((column, i) => { return { @@ -24,7 +30,7 @@ const ExtensionDataTable = ({table}) => { const dataRow = {}; row.forEach((cell, j) => { dataRow[`col${j}Value`] = cell['valueUnformatted'] || cell.value || cell; - dataRow[`col${j}Display`] = cell.value || cell; + dataRow[`col${j}Display`] = mapToCell(cell.value || cell, j); }); return dataRow; }) @@ -37,96 +43,17 @@ const ExtensionDataTable = ({table}) => { pagingType: "numbers", order: [[1, "desc"]] } - return ( - - ) -} - -const sortComparator = (columnIndex) => (rowA, rowB) => { - const a = rowA[columnIndex].valueUnformatted; - const b = rowB[columnIndex].valueUnformatted; - if (a === b) return 0; - if (isNaN(Number(a)) || isNaN(Number(b))) { - return String(a).toLowerCase().localeCompare(String(b).toLowerCase()); - } else { - const numA = Number(a); - const numB = Number(b); - if (numA < numB) return -1; - if (numA > numB) return 1; - return 0; + const rowKeyFunction = (row, column) => { + return JSON.stringify(Object.entries(row).filter(e => e[0].includes('Value'))) + "-" + JSON.stringify(column?.data?._); } -} - -const sortRows = (rows, sortIndex, sortReversed) => { - if (sortIndex === undefined) return rows; - - const comparator = sortComparator(sortIndex); - const sorted = rows.sort(comparator); - if (sortReversed) return rows.reverse(); - return sorted; -} - -const ExtensionColoredTable = ({table}) => { - const {nightModeEnabled} = useTheme(); - const {t} = useTranslation(); - - const [sortBy, setSortBy] = useState(undefined); - const [sortReverse, setSortReverse] = useState(false); - const changeSort = useCallback(index => { - if (index === sortBy) { - setSortReverse(!sortReverse); - } else { - setSortBy(index); - setSortReverse(false); - } - - }, [sortBy, setSortBy, sortReverse, setSortReverse]); - - const mapToCell = (value, j) => { - if (String(value?.value).startsWith("; - } - return - - ; - }; - - const rows = table.table.rows.length ? sortRows(table.table.rows, sortBy, sortReverse) - .map((row, i) => {row.map(mapToCell)}) : - {table.table.columns.map((column, i) => - {i === 0 ? t('generic.noData') : '-'})} - return ( - - - - {table.table.columns.map((column, i) => )} - - - - {rows} - -
changeSort(i)}> - -   - {column} -   - -
+ ) } const ExtensionTable = ({table}) => { - const tableLength = table.table.rows.length; - - if (tableLength > 10) { - return - } else { - return - } + return ; } export default ExtensionTable \ No newline at end of file diff --git a/react/dashboard/dashboard/src/components/graphs/GeolocationWorldMap.js b/react/dashboard/dashboard/src/components/graphs/GeolocationWorldMap.js index 9064b5f1c..5a6002848 100644 --- a/react/dashboard/dashboard/src/components/graphs/GeolocationWorldMap.js +++ b/react/dashboard/dashboard/src/components/graphs/GeolocationWorldMap.js @@ -28,7 +28,7 @@ const getProjection = option => { } } -const GeolocationWorldMap = ({series, colors, projection}) => { +const GeolocationWorldMap = ({series, colors, projection, onClickCountry}) => { const {t} = useTranslation(); const {nightModeEnabled, graphTheming} = useTheme(); @@ -37,7 +37,12 @@ const GeolocationWorldMap = ({series, colors, projection}) => { name: t('html.label.players'), type: 'map', data: series, - joinBy: ['iso-a3', 'code'] + joinBy: ['iso-a3', 'code'], + point: { + events: { + click: onClickCountry + } + } }; NoDataDisplay(Highcharts); @@ -71,7 +76,7 @@ const GeolocationWorldMap = ({series, colors, projection}) => { }, series: [mapSeries] }) - }, [colors, series, graphTheming, nightModeEnabled, t, projection]); + }, [colors, series, graphTheming, nightModeEnabled, t, projection, onClickCountry]); return (
); }; diff --git a/react/dashboard/dashboard/src/components/graphs/JoinAddressGraph.js b/react/dashboard/dashboard/src/components/graphs/JoinAddressGraph.js index 07c93917c..21227820f 100644 --- a/react/dashboard/dashboard/src/components/graphs/JoinAddressGraph.js +++ b/react/dashboard/dashboard/src/components/graphs/JoinAddressGraph.js @@ -34,8 +34,10 @@ const JoinAddressGraph = ({id, data, colors, stack}) => { const labels = dates; const series = Object.entries(valuesByAddress).map((entry, i) => { - if (i >= colors.length) return {name: entry[0], data: entry[1]}; - return {name: entry[0], data: entry[1], color: getColor(i)}; + let name = entry[0]; + if (name === 'plugin.generic.unknown') name = t('plugin.generic.unknown') + if (i >= colors.length) return {name: name, data: entry[1]}; + return {name: name, data: entry[1], color: getColor(i)}; }); Highcharts.stockChart(id, { diff --git a/react/dashboard/dashboard/src/components/graphs/PlayerbaseGraph.js b/react/dashboard/dashboard/src/components/graphs/PlayerbaseGraph.js index cbfb90907..793b42665 100644 --- a/react/dashboard/dashboard/src/components/graphs/PlayerbaseGraph.js +++ b/react/dashboard/dashboard/src/components/graphs/PlayerbaseGraph.js @@ -6,6 +6,23 @@ import Highcharts from "highcharts/highstock"; import {withReducedSaturation} from "../../util/colors"; import Accessibility from "highcharts/modules/accessibility"; +export const getTranslateLabelForActivityGroup = value => { + switch (value) { + case "Very Active": + return 'html.label.veryActive' + case "Active": + return 'html.label.active' + case "Regular": + return 'html.label.indexRegular' + case "Irregular": + return 'html.label.irregular' + case "Inactive": + return 'html.label.indexInactive' + default: + return 'plugin.generic.unknown' + } +} + const PlayerbaseGraph = ({data}) => { const {t} = useTranslation() const {nightModeEnabled, graphTheming} = useTheme(); @@ -23,7 +40,12 @@ const PlayerbaseGraph = ({data}) => { Highcharts.setOptions(graphTheming); const labels = data?.activity_labels; - const series = data?.activity_series; + const series = data?.activity_series.map(dataSet => { + return { + ...dataSet, + name: t(dataSet.name) + } + }); Highcharts.chart(id, { chart: { diff --git a/react/dashboard/dashboard/src/components/modal/QueryPlayerListModal.js b/react/dashboard/dashboard/src/components/modal/QueryPlayerListModal.js new file mode 100644 index 000000000..1ce439781 --- /dev/null +++ b/react/dashboard/dashboard/src/components/modal/QueryPlayerListModal.js @@ -0,0 +1,38 @@ +import React from 'react'; +import {useTranslation} from "react-i18next"; +import {Modal} from "react-bootstrap"; +import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome"; +import {faArrowRight, faSearch} from "@fortawesome/free-solid-svg-icons"; +import PlayerListCard from "../cards/common/PlayerListCard"; +import {getViewTitle} from "../../views/query/QueryResultView"; +import {ChartLoader} from "../navigation/Loader"; +import {Link} from "react-router-dom"; +import {useAuth} from "../../hooks/authenticationHook"; + +const QueryPlayerListModal = ({open, toggle, queryData, title}) => { + const {t} = useTranslation(); + const {hasPermission} = useAuth(); + return ( + + + + {queryData ? title || getViewTitle(queryData, t, true) : t('html.query.title.text').replace('<', '')} + + + + + ) +}; + +export default QueryPlayerListModal \ No newline at end of file diff --git a/react/dashboard/dashboard/src/components/table/DataTablesTable.js b/react/dashboard/dashboard/src/components/table/DataTablesTable.js index e807578d2..e2b7fd587 100644 --- a/react/dashboard/dashboard/src/components/table/DataTablesTable.js +++ b/react/dashboard/dashboard/src/components/table/DataTablesTable.js @@ -79,7 +79,7 @@ const VisibleColumnsSelector = ({columns, visibleColumnIndexes, toggleColumn}) = ) } -const DataTablesTable = ({id, rowKeyFunction, options}) => { +const DataTablesTable = ({id, rowKeyFunction, options, colorClass}) => { const {t} = useTranslation(); const {nightModeEnabled} = useTheme(); @@ -88,22 +88,23 @@ const DataTablesTable = ({id, rowKeyFunction, options}) => { const [sortReversed, setSortReversed] = useState(options.order[0][1] === 'asc'); const [visibleColumnIndexes, setVisibleColumnIndexes] = useState(columns.map((_, i) => i)); const toggleColumn = useCallback(index => { + const currentSortIndex = visibleColumnIndexes[sortBy]; if (visibleColumnIndexes.includes(index)) { if (visibleColumnIndexes.length === 1) return; const newVisible = visibleColumnIndexes.filter(i => i !== index); newVisible.sort((a, b) => a - b); setVisibleColumnIndexes(newVisible); - if (sortBy === index) { + if (currentSortIndex === index) { setSortBy(0); setSortReversed(false); - } else if (index < sortBy) { + } else if (index <= currentSortIndex) { setSortBy(sortBy - 1); // Keep the current sort } } else { const newVisible = [index, ...visibleColumnIndexes]; newVisible.sort((a, b) => a - b); setVisibleColumnIndexes(newVisible); - if (sortBy >= index) { + if (currentSortIndex >= index) { setSortBy(sortBy + 1); // Keep the current sort } } @@ -122,7 +123,9 @@ const DataTablesTable = ({id, rowKeyFunction, options}) => { if (valA === undefined && valB === undefined) return 0; if (valA === undefined) return sortReversed ? 1 : -1; if (valB === undefined) return sortReversed ? 1 : -1; - if (Number.isSafeInteger(valA) && Number.isSafeInteger(valB)) { + const isNumberA = typeof valA === 'number' || !isNaN(valA); + const isNumberB = typeof valB === 'number' || !isNaN(valB); + if (isNumberA && isNumberB) { return sortReversed ? valA - valB : valB - valA; } return sortReversed ? valB.localeCompare(valA) : valA.localeCompare(valB); @@ -198,14 +201,14 @@ const DataTablesTable = ({id, rowKeyFunction, options}) => {
-
+ {columns.length > 2 &&
-
+
} - + {visibleColumns.map((column, i) => + {!rows.length && + {visibleColumns.map((column, i) => )} + } {rows.map(row => {visibleColumns.map((column, i) => { @@ -263,7 +271,8 @@ const DataTablesTable = ({id, rowKeyFunction, options}) => { )}
+ {i === 0 && t('html.label.noDataToDisplay')} +
-

+

{ m: matchingData.length }}/>

-
+
diff --git a/react/dashboard/dashboard/src/components/table/GroupTable.js b/react/dashboard/dashboard/src/components/table/GroupTable.js index 122f0ebec..7cfbecf10 100644 --- a/react/dashboard/dashboard/src/components/table/GroupTable.js +++ b/react/dashboard/dashboard/src/components/table/GroupTable.js @@ -5,9 +5,10 @@ import {withReducedSaturation} from "../../util/colors"; import Scrollable from "../Scrollable"; const GroupRow = ({group, color}) => { + const {t} = useTranslation(); return ( - {group.name} + {t(group.name)} {group.y} ) diff --git a/react/dashboard/dashboard/src/components/table/PingTable.js b/react/dashboard/dashboard/src/components/table/PingTable.js index 43843e453..00f0adc79 100644 --- a/react/dashboard/dashboard/src/components/table/PingTable.js +++ b/react/dashboard/dashboard/src/components/table/PingTable.js @@ -30,7 +30,7 @@ const PingTable = ({countries}) => { - {countries.length ? countries.map((country, i) => ) : + {countries.length ? countries.map(country => ) : {t('generic.noData')} - - diff --git a/react/dashboard/dashboard/src/components/text/FormattedDate.js b/react/dashboard/dashboard/src/components/text/FormattedDate.js index 761e937d1..af5be08a0 100644 --- a/react/dashboard/dashboard/src/components/text/FormattedDate.js +++ b/react/dashboard/dashboard/src/components/text/FormattedDate.js @@ -9,7 +9,7 @@ const FormattedDate = ({date}) => { const {timeZoneOffsetHours} = useMetadata(); const {preferencesLoaded, dateFormatNoSeconds, recentDaysInDateFormat} = usePreferences(); - if (!preferencesLoaded) return <> + if (!preferencesLoaded || date === undefined || date === null) return <> const pattern = dateFormatNoSeconds; const recentDays = recentDaysInDateFormat; diff --git a/react/dashboard/dashboard/src/style/style.css b/react/dashboard/dashboard/src/style/style.css index aed19cd60..8d1e64c33 100644 --- a/react/dashboard/dashboard/src/style/style.css +++ b/react/dashboard/dashboard/src/style/style.css @@ -946,6 +946,12 @@ div#navSrvContainer::-webkit-scrollbar-thumb { color: var(--color-text-dark-bg); } +.bg-theme.btn:hover, body.theme .fc-toolbar-chunk .btn.btn-primary:hover, .fc-button:hover { + background-color: color-mix(in srgb, var(--color-theme) 90%, black) !important; + --bs-btn-disabled-bg: var(--color-theme); + color: color-mix(in srgb, var(--color-text-dark-bg) 85%, black) !important; +} + .bg-success { background-color: var(--color-success) !important; } diff --git a/react/dashboard/dashboard/src/util/formatters.js b/react/dashboard/dashboard/src/util/formatters.js index c54bfb71e..7a7ae33a3 100644 --- a/react/dashboard/dashboard/src/util/formatters.js +++ b/react/dashboard/dashboard/src/util/formatters.js @@ -22,4 +22,11 @@ export const formatTimeAmount = (ms) => { out += seconds.toString() + "s "; return out; +} + +export const formatDecimals = (value, formatPattern) => { + if (!formatPattern) return value; + const split = formatPattern.split('.'); + if (split.length <= 1) return value.toFixed(0); + return value.toFixed(split[1].length); } \ No newline at end of file diff --git a/react/dashboard/dashboard/src/views/common/Geolocations.js b/react/dashboard/dashboard/src/views/common/Geolocations.js index 261f3a954..a0013d330 100644 --- a/react/dashboard/dashboard/src/views/common/Geolocations.js +++ b/react/dashboard/dashboard/src/views/common/Geolocations.js @@ -7,7 +7,7 @@ import LoadIn from "../../components/animation/LoadIn"; import ExtendableRow from "../../components/layout/extension/ExtendableRow"; const Geolocations = ( - {className, geolocationData, pingData, geolocationError, pingError, seeGeolocations, seePing} + {className, identifier, geolocationData, pingData, geolocationError, pingError, seeGeolocations, seePing} ) => { return ( @@ -16,7 +16,8 @@ const Geolocations = ( {seeGeolocations && <> {geolocationError ? - : } + : } } {seePing && <> {pingError ? : } diff --git a/react/dashboard/dashboard/src/views/layout/PlayerPage.js b/react/dashboard/dashboard/src/views/layout/PlayerPage.js index 219777a58..de024ce59 100644 --- a/react/dashboard/dashboard/src/views/layout/PlayerPage.js +++ b/react/dashboard/dashboard/src/views/layout/PlayerPage.js @@ -42,14 +42,20 @@ const PlayerPage = () => { {name: 'html.label.servers', icon: faNetworkWired, href: "servers", permission: 'page.player.servers'} ] - player?.extensions?.map(extension => { - return { - name: `${t('html.label.plugins')} (${extension.serverName})`, - icon: faCubes, - href: `plugins/${encodeURIComponent(extension.serverName)}`, - permission: 'page.player.plugins' - } - }).forEach(item => items.push(item)); + items.push({ + name: 'html.label.plugins', + permission: 'page.player.plugins', + icon: faCubes, + contents: player?.extensions?.filter(extension => extension?.extensionData?.length) + .map(extension => { + return { + name: `${t('html.label.plugins')} (${extension.serverName})`, + icon: faCubes, + href: `plugins/${encodeURIComponent(extension.serverName)}`, + permission: 'page.player.plugins' + } + }) + }); setSidebarItems(items); window.document.title = `Plan | ${player?.info?.name}`; diff --git a/react/dashboard/dashboard/src/views/layout/QueryPage.js b/react/dashboard/dashboard/src/views/layout/QueryPage.js index e47d0358b..918573ed8 100644 --- a/react/dashboard/dashboard/src/views/layout/QueryPage.js +++ b/react/dashboard/dashboard/src/views/layout/QueryPage.js @@ -12,6 +12,8 @@ import {QueryResultContextProvider} from "../../hooks/queryResultContext"; import {useAuth} from "../../hooks/authenticationHook"; import MainPageRedirect from "../../components/navigation/MainPageRedirect"; +const HelpModal = React.lazy(() => import("../../components/modal/HelpModal")); + const QueryPage = () => { const {t, i18n} = useTranslation(); const {isProxy, networkName, serverName} = useMetadata(); @@ -49,6 +51,7 @@ const QueryPage = () => {
diff --git a/react/dashboard/dashboard/src/views/query/QueryResultView.js b/react/dashboard/dashboard/src/views/query/QueryResultView.js index 183889ef3..573c3107b 100644 --- a/react/dashboard/dashboard/src/views/query/QueryResultView.js +++ b/react/dashboard/dashboard/src/views/query/QueryResultView.js @@ -13,6 +13,27 @@ import GeolocationsCard from "../../components/cards/common/GeolocationsCard"; import SessionsWithinViewCard from "../../components/cards/query/SessionsWithinViewCard"; import {useNavigation} from "../../hooks/navigationHook"; +const serverCount = (count, t) => { + if (count === 0) { + return t('html.query.label.servers.all'); + } else if (count === 1) { + return t('html.query.label.servers.single'); + } else if (count === 2) { + return t('html.query.label.servers.two'); + } else { + return t('html.query.label.servers.many').replace('{number}', count); + } +} + +export const getViewTitle = (result, t, showTime) => { + if (!result) return ''; + + return 'View: ' + result.view.afterDate + (showTime ? ', ' + result.view.afterTime : '') + + " - " + result.view.beforeDate + (showTime ? ', ' + result.view.beforeTime : '') + ', ' + + serverCount(result.view.servers.length, t) + + (result.view.servers.length ? ': ' + result.view.servers.map(server => server.serverName).join(', ') : '') +} + const QueryResultView = () => { const {t} = useTranslation(); const navigate = useNavigate(); @@ -49,11 +70,6 @@ const QueryResultView = () => { return <> } - const getViewTitle = () => { - return 'View: ' + result.view.afterDate + " - " + result.view.beforeDate + ', ' + - (result.view.servers.len ? 'using data of servers: ' + result.view.servers.map(server => server.name).join(', ') : "using data of all servers") - } - return (
@@ -62,7 +78,7 @@ const QueryResultView = () => { diff --git a/react/dashboard/dashboard/src/views/server/ServerGeolocations.js b/react/dashboard/dashboard/src/views/server/ServerGeolocations.js index 70f9c13c3..11dfa2898 100644 --- a/react/dashboard/dashboard/src/views/server/ServerGeolocations.js +++ b/react/dashboard/dashboard/src/views/server/ServerGeolocations.js @@ -16,6 +16,7 @@ const ServerGeolocations = () => { return ( diff --git a/react/dashboard/dashboard/src/views/server/ServerOverview.js b/react/dashboard/dashboard/src/views/server/ServerOverview.js index c763dd9c0..0fea3a70a 100644 --- a/react/dashboard/dashboard/src/views/server/ServerOverview.js +++ b/react/dashboard/dashboard/src/views/server/ServerOverview.js @@ -1,7 +1,14 @@ import React from "react"; -import {Card, Col} from "react-bootstrap"; -import {faExclamationCircle, faPowerOff, faTachometerAlt, faUser, faUsers} from "@fortawesome/free-solid-svg-icons"; +import {Alert, Card, Col} from "react-bootstrap"; +import { + faExclamationCircle, + faInfoCircle, + faPowerOff, + faTachometerAlt, + faUser, + faUsers +} from "@fortawesome/free-solid-svg-icons"; import Datapoint from "../../components/Datapoint"; import {useTranslation} from "react-i18next"; import {useParams} from "react-router-dom"; @@ -15,12 +22,15 @@ import LoadIn from "../../components/animation/LoadIn"; import {CardLoader} from "../../components/navigation/Loader"; import ExtendableRow from "../../components/layout/extension/ExtendableRow"; import {useAuth} from "../../hooks/authenticationHook"; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; const Last7DaysCard = ({data}) => { const {t} = useTranslation(); if (!data) return ; + const noData = data.average_tps === 'plugin.generic.unavailable' + return ( @@ -28,6 +38,9 @@ const Last7DaysCard = ({data}) => { {t('html.label.last7days')} + {noData && + {t('html.description.noData7d')} + } =3.0.0 <4.0.0" immutable "^4.0.0" @@ -9594,11 +9656,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -10183,7 +10240,7 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: +tslib@^2.3.0, tslib@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -10316,11 +10373,11 @@ uncontrollable@^8.0.1: integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== undici@^5.24.0: - version "5.25.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.25.1.tgz#3fa537eb89a6a0bb576b395f0f7bcdedf7b8336a" - integrity sha512-nTw6b2G2OqP6btYPyghCgV4hSwjJlL/78FMJatVLCa3otj6PCOQSt6dVtYt82OtNqFz8XsnJ+vsXLADPXjPhqw== + version "5.26.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" + integrity sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw== dependencies: - busboy "^1.6.0" + "@fastify/busboy" "^2.0.0" unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0"