This commit is contained in:
AuroraLS3 2023-10-21 09:14:36 +00:00
parent 4379ac2450
commit 9d07bcef1f
48 changed files with 706 additions and 254 deletions

View File

@ -0,0 +1 @@
45VvUnNtiDHKZ+hq3vqx204q+tmLRE/koVskJLaT2+ipY8G1ThqcLZjUMuF79lYLpRIqpAt4KcY=

View File

@ -0,0 +1 @@
YEQ4eTdZPzUpUV4zcTp6NkE7XEw=

View File

@ -257,6 +257,7 @@ html:
noServers: "数据库中找不到服务器"
noServersLong: '看起来 Plan 没有安装在任何游戏服务器上或者游戏服务器未连接到相同的数据库。 群组网络教程请参见:<a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a>'
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: ">到 </label>"
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} ) 端口上运行"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a>.'
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</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a> 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</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a> 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</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a> 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</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wikiin</a> 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</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a> 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: ">à</label>"
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} )."

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a> 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</label>"
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} )"

View File

@ -257,6 +257,7 @@ html:
noServers: "データーベース内に登録されたサーバーが見つかりません"
noServersLong: 'プランがどのゲーム サーバーにもインストールされていないか、同じデータベースに接続されていないようです。ネットワーク チュートリアルについては、<a href="https://github.com/plan-player-analytics/Plan/wiki">Wiki</a>を参考にしてください'
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: ">に</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a> 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</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">de wiki</a> 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</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a> 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</label>"
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} )"

View File

@ -257,6 +257,7 @@ html:
noServers: "В базе данных не найдено ни одного сервера"
noServersLong: 'Похоже, что Plan не установлен ни на одном игровом сервере или не подключен к той же базе данных. Смотрите <a href="https://github.com/plan-player-analytics/Plan/wiki">вики</a> для помощи.'
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: ">в</label>"
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} )"

View File

@ -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 <a href="https://github.com/plan-player-analytics/Plan/wiki"> wiki </a> '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</label>"
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} )"

View File

@ -257,6 +257,7 @@ html:
noServers: "У базі даних не знайдено жодного сервера"
noServersLong: 'Схоже, що Plan не встановлено на жодному ігровому сервері або не підключено до тієї самої бази даних. Дивіться <a href="https://github.com/plan-player-analytics/Plan/wiki">вікі</a> для допомоги.'
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: ">в</label>"
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} )"

View File

@ -257,6 +257,7 @@ html:
noServers: "資料庫中找不到伺服器"
noServersLong: '看起來 Plan 沒有安裝在任何遊戲伺服器上或者遊戲伺服器未連接到相同的資料庫。 群組網路教程請參見:<a href="https://github.com/plan-player-analytics/Plan/wiki">wiki</a>'
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: ">到 </label>"
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} ) 端口上執行"

View File

@ -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"

View File

@ -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 ? <b>{translatedValue}</b> : translatedValue;
const extraLabel = typeof valueLabel === 'string' ? ` (${t(valueLabel)})` : '';
const extraLabel = getExtraLabel(t, valueLabel);
const colorClass = color?.startsWith("col-") ? color : "col-" + color;
return (
<p title={title ? title : name + ": " + translatedValue}>

View File

@ -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 (
<div id={'server-calendar'}>
<p style={explainerStyle}><FontAwesomeIcon icon={faHandPointer}/> {t('html.text.clickAndDrag')}</p>
<FullCalendar
plugins={[dayGridPlugin]}
plugins={[interactionPlugin, dayGridPlugin]}
timeZone="UTC"
themeSystem='bootstrap'
eventColor='#2196F3'
@ -21,6 +34,10 @@ const ServerCalendar = ({series, firstDay}) => {
center: '',
right: 'dayGridMonth dayGridWeek dayGridDay today prev next'
}}
editable={Boolean(onSelect)}
selectable={Boolean(onSelect)}
select={onSelect}
unselectAuto={true}
events={(_fetchInfo, successCallback) => successCallback(series)}
/>
</div>

View File

@ -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 (
<Dropdown className="float-end" style={{position: "absolute", right: "0.5rem"}}
<Dropdown className="float-end" style={{margin: "-0.5rem", marginLeft: 0}}
title={t('html.label.geoProjection.dropdown')}>
<Dropdown.Toggle variant=''>
<Fa icon={faLayerGroup}/> {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 <CardLoader/>
if (!data?.geolocations_enabled) {
@ -48,12 +91,14 @@ const GeolocationsCard = ({data}) => {
return (
<Card id={"geolocations"}>
<Card.Header>
<h6 className="col-black">
<Fa icon={faGlobe} className="col-green"/> {t('html.label.geolocations')}
</h6>
<QueryPlayerListModal open={modalOpen} toggle={closeModal} queryData={queryData}
title={"View " + t('html.query.filter.generic.start') + t('html.query.filter.country.text') + ': ' + country}/>
<CardHeader icon={faGlobe} color={"green"} label={'html.label.geolocations'}>
<ProjectionDropDown projection={projection} setProjection={setProjection}/>
</Card.Header>
<p style={{margin: 0, fontWeight: "normal"}} className={"float-end"}>
<FontAwesomeIcon icon={faHandPointer}/> {t('html.text.click')}
</p>
</CardHeader>
<Card.Body className="chart-area" style={{height: "100%"}}>
<ExtendableRow id={'row-geolocations-graphs-card-0'}>
<Col md={3}>
@ -61,7 +106,7 @@ const GeolocationsCard = ({data}) => {
</Col>
<Col md={9}>
<GeolocationWorldMap series={data.geolocation_series} colors={data.colors}
projection={projection}/>
projection={projection} onClickCountry={onClickCountry}/>
</Col>
</ExtendableRow>
</Card.Body>

View File

@ -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 (
<Card id={'ping-per-country'}>
<CardHeader icon={faWifi} color="green" label={'html.label.connectionInfo'}/>
<PingTable countries={data?.table || []}/>
{data && <PingTable countries={data?.table || []}/>}
{!data && <ChartLoader/>}
</Card>
)
};

View File

@ -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: <><Fa icon={faGlobe}/> {t('html.label.country')}</>,
data: "country"
}, {
title: <><Fa icon={faSignal}/> {t('html.label.averagePing')}</>,
data: {_: "pingAverage", display: "pingAverageFormatted"}
}, {
title: <><Fa icon={faSignal}/> {t('html.label.bestPing')}</>,
data: {_: "pingMin", display: "pingMinFormatted"}
}, {
title: <><Fa icon={faSignal}/> {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: <Link to={"/player/" + player.playerUUID}>{player.playerName}</Link>,
activityIndex: player.activityIndex,
activityIndexAndGroup: player.activityIndex + " (" + t(getActivityGroup(player.activityIndex)) + ")",
activityIndexAndGroup: formatDecimals(player.activityIndex, decimalFormat) + " (" + t(getActivityGroup(player.activityIndex)) + ")",
activePlaytime: player.playtimeActive,
activePlaytimeFormatted: <FormattedTime timeMs={player.playtimeActive}/>,
sessions: player.sessionCount,
@ -81,7 +94,13 @@ const PlayerListCard = ({data, title}) => {
registeredFormatted: <FormattedDate date={player.registered}/>,
lastSeen: player.lastSeen,
lastSeenFormatted: <FormattedDate date={player.lastSeen}/>,
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] = <ExtensionValueTableCell data={player.extensionValues[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 <CardLoader/>
if (!preferencesLoaded) return <></>;
if (!options) return <CardLoader/>;
if (justList) {
return (
<DataTablesTable id={"players-table"} rowKeyFunction={rowKeyFunction} options={options}/>
);
}
return (
<Card>

View File

@ -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}) => {
<Card>
<CardHeader icon={faBookOpen} color={'light-green'} label={server.name + ' ' + t('html.label.asNumbers')}/>
<Card.Body>
<Datapoint icon={faPowerOff} color={'light-green'} name={t('html.label.currentUptime')}
value={server.current_uptime}/>
<CurrentUptime uptime={server.current_uptime}/>
<Datapoint name={t('html.label.lastPeak') + ' (' + server.last_peak_date + ')'}
color={'blue'} icon={faChartLine}
value={server.last_peak_players} valueLabel={t('html.unit.players')} bold/>

View File

@ -115,7 +115,7 @@ const PlayerOverviewCard = ({player}) => {
<Datapoint
icon={faUser} color="amber"
name={<>{t('html.label.activityIndex')} <span>
<button onClick={openHelp}><Fa className={"col-black"}
<button onClick={openHelp}><Fa className={"col-blue"}
icon={faQuestionCircle}/>
</button></span></>}
value={player.info.activity_index} bold

View File

@ -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 <ErrorViewBody error={loadingError}/>
if (!data) return <ChartLoader/>;
return <ServerCalendar series={data.data} firstDay={data.firstDay}/>
return <>
<ServerCalendar series={data.data} firstDay={data.firstDay} onSelect={onSelect}/>
<QueryPlayerListModal open={modalOpen} toggle={closeModal} queryData={queryData}/>
</>
}
const NetworkOnlineActivityGraphsCard = () => {

View File

@ -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 <ErrorViewBody error={loadingError}/>
if (!data) return <ChartLoader/>;
return <TimeByTimeGraph id={"hour-by-hour-graph"}data={data}/>
return <TimeByTimeGraph id={"hour-by-hour-graph"} data={data}/>
}
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 <ErrorViewBody error={loadingError}/>
if (!data) return <ChartLoader/>;
return <ServerCalendar series={data.data} firstDay={data.firstDay}/>
return <>
<ServerCalendar series={data.data} firstDay={data.firstDay} onSelect={onSelect}/>
<QueryPlayerListModal open={modalOpen} toggle={closeModal} queryData={queryData}/>
</>
}
const PunchCardTab = () => {

View File

@ -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}) => {
</Card.Header>
<ExtendableCardBody
id={data.player_kills !== undefined ? 'card-body-server-as-numbers' : 'card-body-network-as-numbers'}>
<Datapoint name={t('html.label.currentUptime')}
color={'light-green'} icon={faPowerOff}
value={data.current_uptime}/>
<CurrentUptime uptime={data.current_uptime}/>
<hr/>
<Datapoint name={t('html.label.totalPlayers')}
color={'black'} icon={faUsers}
@ -69,7 +60,7 @@ const ServerAsNumbersCard = ({data}) => {
<Datapoint name={t('html.label.sessions')}
color={'teal'} icon={faCalendarCheck}
value={data.sessions} bold/>
{data.player_kills && <hr/>}
{data.player_kills !== undefined && <hr/>}
<Datapoint name={t('html.label.playerKills')}
color={'red'} icon={faCrosshairs}
value={data.player_kills} bold/>

View File

@ -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'
? <FontAwesomeIcon icon={faQuestionCircle} title={t('html.description.noUptimeCalculation')}/>
: undefined;
return (
<Datapoint icon={faPowerOff} color={'light-green'}
name={t('html.label.currentUptime')}
value={uptime} valueLabel={infoBubble}/>
)
};
export default CurrentUptime

View File

@ -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("<a class=\"link\" href=\"")) {
let linkHtml = value || String(value);
linkHtml = linkHtml.replace("../", baseAddress + '/');
return <span dangerouslySetInnerHTML={{__html: linkHtml}}/>;
}
return <ColoredText text={value || String(value)}/>
};
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 (
<DataTablesTable id={id} options={options}/>
)
}
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("<a class=\"link\" href=\"")) {
return <td key={JSON.stringify(value)} dangerouslySetInnerHTML={value.value || String(value)}/>;
}
return <td key={JSON.stringify(value)}>
<ColoredText text={value.value || String(value)}/>
</td>;
};
const rows = table.table.rows.length ? sortRows(table.table.rows, sortBy, sortReverse)
.map((row, i) => <tr key={JSON.stringify(row)}>{row.map(mapToCell)}</tr>) :
<tr>{table.table.columns.map((column, i) =>
<td key={JSON.stringify(column)}>{i === 0 ? t('generic.noData') : '-'}</td>)}
</tr>
return (
<table className={"table table-striped" + (nightModeEnabled ? " table-dark" : '')}>
<thead className={table.tableColorClass}>
<tr>
{table.table.columns.map((column, i) => <th className={'extension-table-header'}
key={JSON.stringify(column)} onClick={() => changeSort(i)}>
<ExtensionIcon icon={table.table.icons[i]}/>
&nbsp;
{column}
&nbsp;
<FontAwesomeIcon className={sortBy === i ? '' : 'opacity-50'}
icon={sortBy === i ? (sortReverse ? faSortDown : faSortUp) : faSort}/>
</th>)}
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>
<DataTablesTable id={id} options={options} rowKeyFunction={rowKeyFunction} colorClass={table.tableColorClass}/>
)
}
const ExtensionTable = ({table}) => {
const tableLength = table.table.rows.length;
if (tableLength > 10) {
return <ExtensionDataTable table={table}/>
} else {
return <ExtensionColoredTable table={table}/>
}
return <ExtensionDataTable table={table}/>;
}
export default ExtensionTable

View File

@ -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 (<div id="countryWorldMap"/>);
};

View File

@ -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, {

View File

@ -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: {

View File

@ -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 (
<Modal id="queryModal" aria-labelledby="queryModalLabel" show={open} onHide={toggle} size="xl">
<Modal.Header>
<Modal.Title id="queryModalLabel">
<Fa icon={faSearch}/> {queryData ? title || getViewTitle(queryData, t, true) : t('html.query.title.text').replace('<', '')}
</Modal.Title>
<button aria-label="Close" className="btn-close" type="button" onClick={toggle}/>
</Modal.Header>
{!queryData && <ChartLoader/>}
{queryData &&
<PlayerListCard justList data={queryData?.data?.players || {players: [], extensionDescriptors: []}}
orderBy={2}/>}
<Modal.Footer>
{hasPermission('access.query') && Boolean(queryData?.data?.players.players.length) && <Link className="btn bg-theme"
to={"/query/result?timestamp=" + queryData?.timestamp}>
{t('html.query.label.showFullQuery')} <Fa icon={faArrowRight}/>
</Link>}
<button className="btn bg-theme" onClick={toggle}>OK</button>
</Modal.Footer>
</Modal>
)
};
export default QueryPlayerListModal

View File

@ -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}) => {
<div className={"float-end"}>
<SearchField className={"dataTables_filter"} value={filter} setValue={setFilter}/>
</div>
<div className={"float-start dataTables_columns"}>
{columns.length > 2 && <div className={"float-start dataTables_columns"}>
<VisibleColumnsSelector columns={columns} visibleColumnIndexes={visibleColumnIndexes}
toggleColumn={toggleColumn}/>
</div>
</div>}
<table id={id}
className={"datatable table table-bordered table-striped" + (nightModeEnabled ? " table-dark" : '')}
style={{width: "100%"}}>
<thead id={id + '-head'}>
<thead id={id + '-head'} className={colorClass}>
<tr>
{visibleColumns.map((column, i) => <th key={JSON.stringify(column.data)}>
<button onClick={() => changeSort(i)}>
@ -218,6 +221,11 @@ const DataTablesTable = ({id, rowKeyFunction, options}) => {
</tr>
</thead>
<tbody id={id + '-body'}>
{!rows.length && <tr>
{visibleColumns.map((column, i) => <td key={"col-" + rowKeyFunction(0, column)}>
{i === 0 && t('html.label.noDataToDisplay')}
</td>)}
</tr>}
{rows.map(row => <React.Fragment key={"frag-" + rowKeyFunction(row, null)}>
<tr key={"row-" + rowKeyFunction(row, null)}>
{visibleColumns.map((column, i) => {
@ -263,7 +271,8 @@ const DataTablesTable = ({id, rowKeyFunction, options}) => {
</React.Fragment>)}
</tbody>
</table>
<p className={"dataTables_info float-start"}>
<p className={"dataTables_info float-start"}
style={{maxWidth: "40%", textOverflow: "ellipsis", whiteSpace: "nowrap"}}>
<Trans i18nKey={"html.label.table.showNofM"}
defaults={"Showing {{n}} of {{m}} entries"}
values={{
@ -271,7 +280,7 @@ const DataTablesTable = ({id, rowKeyFunction, options}) => {
m: matchingData.length
}}/>
</p>
<div className={"float-end"}>
<div className={"float-end"} style={{maxWidth: "60%"}}>
<Pagination page={page} setPage={setPage} maxPage={maxPage}/>
</div>
</div>

View File

@ -5,9 +5,10 @@ import {withReducedSaturation} from "../../util/colors";
import Scrollable from "../Scrollable";
const GroupRow = ({group, color}) => {
const {t} = useTranslation();
return (
<tr>
<td style={{color}}>{group.name}</td>
<td style={{color}}>{t(group.name)}</td>
<td>{group.y}</td>
</tr>
)

View File

@ -30,7 +30,7 @@ const PingTable = ({countries}) => {
</tr>
</thead>
<tbody>
{countries.length ? countries.map((country, i) => <PingRow key={i} country={country}/>) : <tr>
{countries.length ? countries.map(country => <PingRow key={country?.country} country={country}/>) : <tr>
<td>{t('generic.noData')}</td>
<td>-</td>
<td>-</td>

View File

@ -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;

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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 (
<LoadIn>
@ -16,7 +16,8 @@ const Geolocations = (
<Col md={12}>
{seeGeolocations && <>
{geolocationError ? <ErrorViewCard error={geolocationError}/>
: <GeolocationsCard data={geolocationData}/>}
: <GeolocationsCard identifier={identifier}
data={geolocationData}/>}
</>}
{seePing && <>
{pingError ? <ErrorViewCard error={pingError}/> : <PingTableCard data={pingData}/>}

View File

@ -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}`;

View File

@ -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 = () => {
</main>
<aside>
<ColorSelectorModal/>
<React.Suspense fallback={""}><HelpModal/></React.Suspense>
</aside>
</div>
</div>

View File

@ -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 (
<LoadIn>
<section className={"query-results-view"}>
@ -62,7 +78,7 @@ const QueryResultView = () => {
<QueryPath/>
<PlayerListCard
data={result.data.players}
title={getViewTitle()}
title={getViewTitle(result, t)}
/>
</Col>
</Row>

View File

@ -16,6 +16,7 @@ const ServerGeolocations = () => {
return (
<Geolocations className={"server-geolocations"}
identifier={identifier}
geolocationData={data} geolocationError={loadingError} seeGeolocations={seeGeolocations}
pingData={pingData} pingError={pingLoadingError} seePing={seePing}
/>

View File

@ -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 <CardLoader/>;
const noData = data.average_tps === 'plugin.generic.unavailable'
return (
<Card id={"last-7-days"}>
<Card.Header>
@ -28,6 +38,9 @@ const Last7DaysCard = ({data}) => {
{t('html.label.last7days')}
</h6>
</Card.Header>
{noData && <Alert className='alert-warning mb-0'>
<FontAwesomeIcon icon={faInfoCircle}/> {t('html.description.noData7d')}
</Alert>}
<Card.Body>
<Datapoint name={t('html.label.uniquePlayers')}
color={'blue'} icon={faUsers}

View File

@ -7,7 +7,7 @@
resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
"@adobe/css-tools@^4.3.0":
"@adobe/css-tools@^4.3.1":
version "4.3.1"
resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28"
integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==
@ -42,6 +42,14 @@
"@babel/highlight" "^7.22.10"
chalk "^2.4.2"
"@babel/code-frame@^7.22.13":
version "7.22.13"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
dependencies:
"@babel/highlight" "^7.22.13"
chalk "^2.4.2"
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9":
version "7.22.9"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730"
@ -87,6 +95,16 @@
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
"@babel/generator@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
dependencies:
"@babel/types" "^7.23.0"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
@ -147,6 +165,11 @@
lodash.debounce "^4.0.8"
resolve "^1.14.2"
"@babel/helper-environment-visitor@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
"@babel/helper-environment-visitor@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
@ -160,6 +183,14 @@
"@babel/template" "^7.22.5"
"@babel/types" "^7.22.5"
"@babel/helper-function-name@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
dependencies:
"@babel/template" "^7.22.15"
"@babel/types" "^7.23.0"
"@babel/helper-hoist-variables@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
@ -248,6 +279,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
"@babel/helper-validator-identifier@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
"@babel/helper-validator-identifier@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
@ -285,11 +321,25 @@
chalk "^2.4.2"
js-tokens "^4.0.0"
"@babel/highlight@^7.22.13":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
dependencies:
"@babel/helper-validator-identifier" "^7.22.20"
chalk "^2.4.2"
js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5":
version "7.22.11"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.11.tgz#becf8ee33aad2a35ed5607f521fe6e72a615f905"
integrity sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==
"@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e"
@ -1131,6 +1181,15 @@
dependencies:
regenerator-runtime "^0.14.0"
"@babel/template@^7.22.15":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
dependencies:
"@babel/code-frame" "^7.22.13"
"@babel/parser" "^7.22.15"
"@babel/types" "^7.22.15"
"@babel/template@^7.22.5", "@babel/template@^7.3.3":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec"
@ -1141,18 +1200,18 @@
"@babel/types" "^7.22.5"
"@babel/traverse@^7.22.11", "@babel/traverse@^7.7.2":
version "7.22.11"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c"
integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==
version "7.23.2"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
dependencies:
"@babel/code-frame" "^7.22.10"
"@babel/generator" "^7.22.10"
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-function-name" "^7.22.5"
"@babel/code-frame" "^7.22.13"
"@babel/generator" "^7.23.0"
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/parser" "^7.22.11"
"@babel/types" "^7.22.11"
"@babel/parser" "^7.23.0"
"@babel/types" "^7.23.0"
debug "^4.1.0"
globals "^11.1.0"
@ -1165,6 +1224,15 @@
"@babel/helper-validator-identifier" "^7.22.5"
to-fast-properties "^2.0.0"
"@babel/types@^7.22.15", "@babel/types@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
dependencies:
"@babel/helper-string-parser" "^7.22.5"
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@ -1318,6 +1386,11 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d"
integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==
"@fastify/busboy@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8"
integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==
"@fortawesome/fontawesome-common-types@6.4.2":
version "6.4.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5"
@ -1363,36 +1436,32 @@
dependencies:
prop-types "^15.8.1"
"@fullcalendar/bootstrap@^5.11.5":
version "5.11.5"
resolved "https://registry.yarnpkg.com/@fullcalendar/bootstrap/-/bootstrap-5.11.5.tgz#97de88d5b7821d575fd6259e826d8f8b9a3f3e9b"
integrity sha512-btsVVJuLQ9UNTj0SeHNHxwM3uzfHi6RsjtMQs13sXzp3tu2d6FTI849VJHs81GfTZp+fwK0RD2tZ/eswN58A5Q==
dependencies:
"@fullcalendar/common" "~5.11.5"
tslib "^2.1.0"
"@fullcalendar/bootstrap@^6.1.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@fullcalendar/bootstrap/-/bootstrap-6.1.9.tgz#53a45ff0fc1090155caa99d94a6065b77dbe7813"
integrity sha512-NcXc6uH2cqeB3YaCHDut6Krjl9tSN0zbH/PFuKpslbA4FMZOPKtxbF5uh9Vs+B7HyCY4sBrKzPAQWGAcYf1exQ==
"@fullcalendar/common@~5.11.5":
version "5.11.5"
resolved "https://registry.yarnpkg.com/@fullcalendar/common/-/common-5.11.5.tgz#1a30a852b33ab5c1b04f4ee558941bed3c72d07f"
integrity sha512-3iAYiUbHXhjSVXnYWz27Od2cslztUPsOwiwKlfGvQxBixv2Kl6a8IPwaijKFYJHXdwYmfPoEgK7rvqAGVoIYwA==
"@fullcalendar/core@^6.1.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@fullcalendar/core/-/core-6.1.9.tgz#ea735b0dd0a0a487969ebbb6c99b0967e07568c0"
integrity sha512-eeG+z9BWerdsU9Ac6j16rpYpPnE0wxtnEHiHrh/u/ADbGTR3hCOjCD9PxQOfhOTHbWOVs7JQunGcksSPu5WZBQ==
dependencies:
tslib "^2.1.0"
preact "~10.12.1"
"@fullcalendar/daygrid@^5.11.5":
version "5.11.5"
resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-5.11.5.tgz#2825ed691eadf72c6a2979bcde871de74681fc7a"
integrity sha512-hMpq0U3Nucys2jDD+crbkJCr+tVt3fDw04OE3fbpisuzqtrHxIzRmnUOdbWUjJQyToAAkt7UVUQ9E7hYdmvyGA==
dependencies:
"@fullcalendar/common" "~5.11.5"
tslib "^2.1.0"
"@fullcalendar/daygrid@^6.1.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-6.1.9.tgz#efb8aabb2f928ac0b05a77c5443accb546ae5818"
integrity sha512-o/6joH/7lmVHXAkbaa/tUbzWYnGp/LgfdiFyYPkqQbjKEeivNZWF1WhHqFbhx0zbFONSHtrvkjY2bjr+Ef2quQ==
"@fullcalendar/react@^5.11.5":
version "5.11.5"
resolved "https://registry.yarnpkg.com/@fullcalendar/react/-/react-5.11.5.tgz#36e2f7b6d92dd1d8120003c6822323c32cb7223a"
integrity sha512-PbBlDyKJ8IQYf5mBdD1mjDas2v3eEU1UfWYLv0e6uGCktH+g4mgaG/LCDOwE65V5VH5FH8+kVkFjIScwA54WwA==
dependencies:
"@fullcalendar/common" "~5.11.5"
tslib "^2.1.0"
"@fullcalendar/interaction@^6.1.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@fullcalendar/interaction/-/interaction-6.1.9.tgz#9023922df24c296cb7f4671887f1731f5d5a5db2"
integrity sha512-I3FGnv0kKZpIwujg3HllbKrciNjTqeTYy3oJG226oAn7lV6wnrrDYMmuGmA0jPJAGN46HKrQqKN7ItxQRDec4Q==
"@fullcalendar/react@^6.1.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@fullcalendar/react/-/react-6.1.9.tgz#280fd543901d792c19b50f363c55cc3068917299"
integrity sha512-ioxu0V++pYz2u/N1LL1V8DkMyiKGRun0gMAll2tQz3Kzi3r9pTwncGKRb1zO8h0e+TrInU08ywk/l5lBwp7eog==
"@highcharts/map-collection@^2.1.0":
version "2.1.0"
@ -2280,12 +2349,12 @@
lz-string "^1.4.4"
pretty-format "^27.0.2"
"@testing-library/jest-dom@^6.1.3":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.3.tgz#443118c9e4043f96396f120de2c7122504a079c5"
integrity sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ==
"@testing-library/jest-dom@^6.1.4":
version "6.1.4"
resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz#cf0835c33bc5ef00befb9e672b1e3e6a710e30e3"
integrity sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==
dependencies:
"@adobe/css-tools" "^4.3.0"
"@adobe/css-tools" "^4.3.1"
"@babel/runtime" "^7.9.2"
aria-query "^5.0.0"
chalk "^3.0.0"
@ -3082,12 +3151,7 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
aria-query@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c"
integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==
aria-query@^5.1.3:
aria-query@^5.0.0, aria-query@^5.1.3:
version "5.3.0"
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
@ -3560,13 +3624,6 @@ builtin-modules@^3.1.0:
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
busboy@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
dependencies:
streamsearch "^1.1.0"
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@ -5790,10 +5847,10 @@ i18next-resources-to-backend@1.1.4:
dependencies:
"@babel/runtime" "^7.21.5"
i18next@^23.5.1:
version "23.5.1"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.5.1.tgz#7f7c35ffaa907618d9489f106d5006b09fbca3d3"
integrity sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg==
i18next@^23.6.0:
version "23.6.0"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.6.0.tgz#c6e996cfd3fef0bf60be3b7c581c35338dba5a71"
integrity sha512-z0Cxr0MGkt+kli306WS4nNNM++9cgt2b2VCMprY92j+AIab/oclgPxdwtTZVLP1zn5t5uo8M6uLsZmYrcjr3HA==
dependencies:
"@babel/runtime" "^7.22.5"
@ -8335,6 +8392,11 @@ postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4:
picocolors "^1.0.0"
source-map-js "^1.0.2"
preact@~10.12.1:
version "10.12.1"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.12.1.tgz#8f9cb5442f560e532729b7d23d42fd1161354a21"
integrity sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==
prebuild-install@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
@ -8670,10 +8732,10 @@ react-error-overlay@^6.0.11:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
react-i18next@^13.2.2:
version "13.2.2"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.2.2.tgz#b1e78ed66a54f4bc819616f68b98221e1b1a1936"
integrity sha512-+nFUkbRByFwnrfDcYqvzBuaeZb+nACHx+fAWN/pZMddWOCJH5hoc21+Sa/N/Lqi6ne6/9wC/qRGOoQhJa6IkEQ==
react-i18next@^13.3.1:
version "13.3.1"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.3.1.tgz#9b072bf4dd4cafb028e92315a8a1415f8034bdca"
integrity sha512-JAtYREK879JXaN9GdzfBI4yJeo/XyLeXWUsRABvYXiFUakhZJ40l+kaTo+i+A/3cKIED41kS/HAbZ5BzFtq/Og==
dependencies:
"@babel/runtime" "^7.22.5"
html-parse-stringify "^3.0.1"
@ -9205,10 +9267,10 @@ sass-loader@^12.3.0:
klona "^2.0.4"
neo-async "^2.6.2"
sass@^1.69.0:
version "1.69.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.0.tgz#5195075371c239ed556280cf2f5944d234f42679"
integrity sha512-l3bbFpfTOGgQZCLU/gvm1lbsQ5mC/WnLz3djL2v4WCJBDrWm58PO+jgngcGRNnKUh6wSsdm50YaovTqskZ0xDQ==
sass@^1.69.4:
version "1.69.4"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.4.tgz#10c735f55e3ea0b7742c6efa940bce30e07fbca2"
integrity sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA==
dependencies:
chokidar ">=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"