Translated dynamic content on Java side

This commit is contained in:
Rsl1122 2019-09-22 12:03:27 +03:00
parent ab124f155e
commit 2fa7689088
26 changed files with 495 additions and 435 deletions

View File

@ -20,6 +20,8 @@ import com.djrapitops.plan.delivery.domain.container.DataContainer;
import com.djrapitops.plan.delivery.domain.keys.PlayerKeys;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.gathering.domain.Session;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.HtmlLang;
import com.djrapitops.plugin.api.TimeAmount;
import java.util.List;
@ -86,8 +88,27 @@ public class ActivityIndex {
this.date = date;
}
public static String[] getGroups() {
return new String[]{"Very Active", "Active", "Regular", "Irregular", "Inactive"};
public static String[] getDefaultGroups() {
return getGroups(null);
}
public static String[] getGroups(Locale locale) {
if (locale == null) {
return new String[]{
HtmlLang.INDEX_VERY_ACTIVE.getDefault(),
HtmlLang.INDEX_ACTIVE.getDefault(),
HtmlLang.INDEX_REGULAR.getDefault(),
HtmlLang.INDEX_IRREGULAR.getDefault(),
HtmlLang.INDEX_INACTIVE.getDefault()
};
}
return new String[]{
locale.get(HtmlLang.INDEX_VERY_ACTIVE).toString(),
locale.get(HtmlLang.INDEX_ACTIVE).toString(),
locale.get(HtmlLang.INDEX_REGULAR).toString(),
locale.get(HtmlLang.INDEX_IRREGULAR).toString(),
locale.get(HtmlLang.INDEX_INACTIVE).toString()
};
}
private double calculate(DataContainer container) {

View File

@ -34,6 +34,8 @@ import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DisplaySettings;
import com.djrapitops.plan.settings.config.paths.TimeSettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.HtmlLang;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.analysis.PlayerCountQueries;
@ -54,6 +56,7 @@ import java.util.concurrent.TimeUnit;
public class JSONFactory {
private final PlanConfig config;
private final Locale locale;
private final DBSystem dbSystem;
private final ServerInfo serverInfo;
private final Graphs graphs;
@ -62,12 +65,14 @@ public class JSONFactory {
@Inject
public JSONFactory(
PlanConfig config,
Locale locale,
DBSystem dbSystem,
ServerInfo serverInfo,
Graphs graphs,
Formatters formatters
) {
this.config = config;
this.locale = locale;
this.dbSystem = dbSystem;
this.serverInfo = serverInfo;
this.graphs = graphs;
@ -85,7 +90,7 @@ public class JSONFactory {
database.query(new ServerTablePlayersQuery(serverUUID, System.currentTimeMillis(), playtimeThreshold, xMostRecentPlayers)),
database.query(new ExtensionServerPlayerDataTableQuery(serverUUID, xMostRecentPlayers)),
openPlayerLinksInNewTab,
formatters
formatters, locale
).toJSONString();
}
@ -100,7 +105,7 @@ public class JSONFactory {
database.query(new NetworkTablePlayersQuery(System.currentTimeMillis(), playtimeThreshold, xMostRecentPlayers)),
Collections.emptyMap(),
openPlayerLinksInNewTab,
formatters
formatters, locale
).toJSONString();
}
@ -200,7 +205,7 @@ public class JSONFactory {
server.put("unique_players", uniquePlayerCounts.getOrDefault(serverUUID, 0));
TPSMutator tpsWeek = tpsMonth.filterDataBetween(weekAgo, now);
double averageTPS = tpsWeek.averageTPS();
server.put("avg_tps", averageTPS != -1 ? decimals.apply(averageTPS) : "No data");
server.put("avg_tps", averageTPS != -1 ? decimals.apply(averageTPS) : locale.get(HtmlLang.UNIT_NO_DATA).toString());
server.put("low_tps_spikes", tpsWeek.lowTpsSpikeCount(config.getNumber(DisplaySettings.GRAPH_TPS_THRESHOLD_MED)));
server.put("downtime", timeAmount.apply(tpsWeek.serverDownTime()));
@ -208,7 +213,7 @@ public class JSONFactory {
server.put("online", online.isPresent() ?
online.get().getDate() >= now - TimeUnit.MINUTES.toMillis(3L) ?
online.get().getPlayers() : "Possibly offline"
: "No data");
: locale.get(HtmlLang.UNIT_NO_DATA).toString());
servers.add(server);
});
return servers;

View File

@ -22,6 +22,9 @@ import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.gathering.domain.TPS;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DisplaySettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.GenericLang;
import com.djrapitops.plan.settings.locale.lang.HtmlLang;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.objects.TPSQueries;
@ -43,6 +46,7 @@ import java.util.concurrent.TimeUnit;
public class PerformanceJSONParser implements ServerTabJSONParser<Map<String, Object>> {
private final PlanConfig config;
private final Locale locale;
private final DBSystem dbSystem;
private final Formatter<Double> decimals;
@ -52,10 +56,12 @@ public class PerformanceJSONParser implements ServerTabJSONParser<Map<String, Ob
@Inject
public PerformanceJSONParser(
PlanConfig config,
Locale locale,
DBSystem dbSystem,
Formatters formatters
) {
this.config = config;
this.locale = locale;
this.dbSystem = dbSystem;
decimals = formatters.decimals();
@ -98,9 +104,9 @@ public class PerformanceJSONParser implements ServerTabJSONParser<Map<String, Ob
numbers.put("tps_30d", format(tpsDataMonth.averageTPS()));
numbers.put("tps_7d", format(tpsDataWeek.averageTPS()));
numbers.put("tps_24h", format(tpsDataDay.averageTPS()));
numbers.put("cpu_30d", percentageFormatter.apply(tpsDataMonth.averageCPU() / 100.0));
numbers.put("cpu_7d", percentageFormatter.apply(tpsDataWeek.averageCPU() / 100.0));
numbers.put("cpu_24h", percentageFormatter.apply(tpsDataDay.averageCPU() / 100.0));
numbers.put("cpu_30d", formatPerc(tpsDataMonth.averageCPU()));
numbers.put("cpu_7d", formatPerc(tpsDataWeek.averageCPU()));
numbers.put("cpu_24h", formatPerc(tpsDataDay.averageCPU()));
numbers.put("ram_30d", format(tpsDataMonth.averageRAM(), " MB"));
numbers.put("ram_7d", format(tpsDataWeek.averageRAM(), " MB"));
numbers.put("ram_24h", format(tpsDataDay.averageRAM(), " MB"));
@ -111,22 +117,26 @@ public class PerformanceJSONParser implements ServerTabJSONParser<Map<String, Ob
numbers.put("chunks_7d", format((int) tpsDataWeek.averageChunks()));
numbers.put("chunks_24h", format((int) tpsDataDay.averageChunks()));
numbers.put("max_disk_30d", format(tpsDataMonth.maxFreeDisk(), " Mb"));
numbers.put("max_disk_7d", format(tpsDataWeek.maxFreeDisk(), " Mb"));
numbers.put("max_disk_24h", format(tpsDataDay.maxFreeDisk(), " Mb"));
numbers.put("min_disk_30d", format(tpsDataMonth.minFreeDisk(), " Mb"));
numbers.put("min_disk_7d", format(tpsDataWeek.minFreeDisk(), " Mb"));
numbers.put("min_disk_24h", format(tpsDataDay.minFreeDisk(), " Mb"));
numbers.put("max_disk_30d", format(tpsDataMonth.maxFreeDisk(), " MB"));
numbers.put("max_disk_7d", format(tpsDataWeek.maxFreeDisk(), " MB"));
numbers.put("max_disk_24h", format(tpsDataDay.maxFreeDisk(), " MB"));
numbers.put("min_disk_30d", format(tpsDataMonth.minFreeDisk(), " MB"));
numbers.put("min_disk_7d", format(tpsDataWeek.minFreeDisk(), " MB"));
numbers.put("min_disk_24h", format(tpsDataDay.minFreeDisk(), " MB"));
return numbers;
}
private String format(double value) {
return value != -1 ? decimals.apply(value) : "Unavailable";
return value != -1 ? decimals.apply(value) : locale.get(GenericLang.UNAVAILABLE).toString();
}
private String format(double value, String suffix) {
return value != -1 ? decimals.apply(value) + suffix : "Unavailable";
return value != -1 ? decimals.apply(value) + suffix : locale.get(GenericLang.UNAVAILABLE).toString();
}
private String formatPerc(double value) {
return value != -1 ? percentageFormatter.apply(value / 100.0) : locale.get(GenericLang.UNAVAILABLE).toString();
}
private Map<String, Object> createInsightsMap(List<TPS> tpsData) {
@ -140,7 +150,7 @@ public class PerformanceJSONParser implements ServerTabJSONParser<Map<String, Ob
double averageCPU = lowTPS.averageCPU();
double averageEntities = lowTPS.averageEntities();
double averageChunks = lowTPS.averageChunks();
insights.put("low_tps_players", avgPlayersOnline != -1 ? decimals.apply(avgPlayersOnline) : "No low tps spikes");
insights.put("low_tps_players", avgPlayersOnline != -1 ? decimals.apply(avgPlayersOnline) : locale.get(HtmlLang.TEXT_NO_LOW_TPS).toString());
insights.put("low_tps_cpu", averageCPU != -1 ? decimals.apply(averageCPU) : "-");
insights.put("low_tps_entities", averageEntities != -1 ? decimals.apply(averageEntities) : "-");
insights.put("low_tps_chunks", averageChunks != -1 ? decimals.apply(averageChunks) : "-");

View File

@ -22,7 +22,6 @@ import com.djrapitops.plan.delivery.domain.mutators.*;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.delivery.rendering.html.Html;
import com.djrapitops.plan.delivery.rendering.html.structure.ServerAccordion;
import com.djrapitops.plan.delivery.rendering.json.graphs.Graphs;
import com.djrapitops.plan.delivery.rendering.json.graphs.pie.WorldPie;
import com.djrapitops.plan.gathering.cache.SessionCache;
@ -32,6 +31,8 @@ import com.djrapitops.plan.gathering.domain.WorldTimes;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DisplaySettings;
import com.djrapitops.plan.settings.config.paths.TimeSettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.GenericLang;
import com.djrapitops.plan.settings.theme.Theme;
import com.djrapitops.plan.settings.theme.ThemeVal;
import com.djrapitops.plan.storage.database.DBSystem;
@ -51,6 +52,7 @@ import java.util.stream.Collectors;
public class PlayerJSONParser {
private final PlanConfig config;
private final Locale locale;
private final Theme theme;
private final DBSystem dbSystem;
private final Graphs graphs;
@ -63,12 +65,14 @@ public class PlayerJSONParser {
@Inject
public PlayerJSONParser(
PlanConfig config,
Locale locale,
Theme theme,
DBSystem dbSystem,
Formatters formatters,
Graphs graphs
) {
this.config = config;
this.locale = locale;
this.theme = theme;
this.dbSystem = dbSystem;
@ -88,7 +92,7 @@ public class PlayerJSONParser {
PlayerContainer player = db.query(new PlayerContainerQuery(playerUUID));
SessionsMutator sessionsMutator = SessionsMutator.forContainer(player);
Map<UUID, WorldTimes> worldTimesPerServer = PerServerMutator.forContainer(player).worldTimesPerServer();
List<Map<String, Object>> serverAccordion = new ServerAccordion(player, serverNames, graphs, year, timeAmount).asMaps();
List<Map<String, Object>> serverAccordion = new ServerAccordion(player, serverNames, graphs, year, timeAmount, locale.get(GenericLang.UNKNOWN).toString()).asMaps();
List<PlayerKill> kills = player.getValue(PlayerKeys.PLAYER_KILLS).orElse(Collections.emptyList());
List<PlayerKill> deaths = player.getValue(PlayerKeys.PLAYER_DEATHS_KILLS).orElse(Collections.emptyList());
@ -178,7 +182,7 @@ public class PlayerJSONParser {
int worstPing = ping.max();
int bestPing = ping.min();
String unavailable = "Unavailable";
String unavailable = locale.get(GenericLang.UNAVAILABLE).toString();
info.put("average_ping", averagePing != -1.0 ? decimals.apply(averagePing) + " ms" : unavailable);
info.put("worst_ping", worstPing != -1.0 ? worstPing + " ms" : unavailable);
info.put("best_ping", bestPing != -1.0 ? bestPing + " ms" : unavailable);

View File

@ -26,6 +26,8 @@ import com.djrapitops.plan.delivery.rendering.html.icon.Icon;
import com.djrapitops.plan.extension.FormatType;
import com.djrapitops.plan.extension.icon.Color;
import com.djrapitops.plan.extension.implementation.results.*;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.HtmlLang;
import java.util.*;
@ -41,6 +43,7 @@ public class PlayersTableJSONParser {
private final List<TablePlayer> players;
private final List<ExtensionDescriptive> extensionDescriptives;
private final Map<UUID, ExtensionTabData> extensionData;
private final Locale locale;
private final boolean openPlayerPageInNewTab;
@ -49,17 +52,17 @@ public class PlayersTableJSONParser {
private Formatter<Double> decimalFormatter;
public PlayersTableJSONParser(
// Data
List<TablePlayer> players,
Map<UUID, ExtensionTabData> extensionData,
// Settings
boolean openPlayerPageInNewTab,
// Formatters
Formatters formatters
Formatters formatters,
Locale locale
) {
// Data
this.players = players;
this.extensionData = extensionData;
this.locale = locale;
extensionDescriptives = new ArrayList<>();
addExtensionDescriptives(extensionData);
@ -132,7 +135,7 @@ public class PlayersTableJSONParser {
ActivityIndex activityIndex = player.getCurrentActivityIndex().orElseGet(() -> new ActivityIndex(0.0, 0));
boolean isBanned = player.isBanned();
String activityString = activityIndex.getFormattedValue(decimalFormatter)
+ (isBanned ? " (<b>Banned</b>)" : " (" + activityIndex.getGroup() + ")");
+ (isBanned ? " (<b>" + locale.get(HtmlLang.LABEL_BANNED) + "</b>)" : " (" + activityIndex.getGroup() + ")");
String geolocation = player.getGeolocation().orElse("-");
@ -190,13 +193,13 @@ public class PlayersTableJSONParser {
// Is the data for the column formatted
columnHeaders
.append(makeColumnHeader(Icon.called("user") + " Name", "name")).append(',')
.append(makeFColumnHeader(Icon.called("check") + " Activity Index", "index")).append(',')
.append(makeFColumnHeader(Icon.called("clock").of(Family.REGULAR) + " Playtime", "playtime")).append(',')
.append(makeColumnHeader(Icon.called("calendar-plus").of(Family.REGULAR) + " Sessions", "sessions")).append(',')
.append(makeFColumnHeader(Icon.called("user-plus") + " Registered", "registered")).append(',')
.append(makeFColumnHeader(Icon.called("calendar-check").of(Family.REGULAR) + " Last Seen", "seen")).append(',')
.append(makeColumnHeader(Icon.called("globe") + " Geolocation", "geolocation"));
.append(makeColumnHeader(Icon.called("user") + " " + locale.get(HtmlLang.LABEL_NAME), "name")).append(',')
.append(makeFColumnHeader(Icon.called("check") + " " + locale.get(HtmlLang.LABEL_ACTIVITY_INDEX), "index")).append(',')
.append(makeFColumnHeader(Icon.called("clock").of(Family.REGULAR) + " " + locale.get(HtmlLang.LABEL_PLAYTIME), "playtime")).append(',')
.append(makeColumnHeader(Icon.called("calendar-plus").of(Family.REGULAR) + " " + locale.get(HtmlLang.SIDE_SESSIONS), "sessions")).append(',')
.append(makeFColumnHeader(Icon.called("user-plus") + " " + locale.get(HtmlLang.LABEL_REGISTERED), "registered")).append(',')
.append(makeFColumnHeader(Icon.called("calendar-check").of(Family.REGULAR) + " " + locale.get(HtmlLang.LABEL_LAST_SEEN), "seen")).append(',')
.append(makeColumnHeader(Icon.called("globe") + " " + locale.get(HtmlLang.TITLE_COUNTRY), "geolocation"));
appendExtensionHeaders(columnHeaders);

View File

@ -14,7 +14,7 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.rendering.html.structure;
package com.djrapitops.plan.delivery.rendering.json;
import com.djrapitops.plan.delivery.domain.container.DataContainer;
import com.djrapitops.plan.delivery.domain.container.PerServerContainer;
@ -30,7 +30,7 @@ import com.djrapitops.plan.gathering.domain.WorldTimes;
import java.util.*;
/**
* HTML utility class for creating a Server Accordion.
* Utility for creating JSON for Server Accordion
*
* @author Rsl1122
*/
@ -38,6 +38,7 @@ public class ServerAccordion {
private final Map<UUID, String> serverNames;
private final PerServerContainer perServer;
private final String unknown;
private final Graphs graphs;
private final Formatter<Long> year;
@ -47,7 +48,8 @@ public class ServerAccordion {
PlayerContainer container, Map<UUID, String> serverNames,
Graphs graphs,
Formatter<Long> year,
Formatter<Long> timeAmount
Formatter<Long> timeAmount,
String unknown
) {
this.graphs = graphs;
this.year = year;
@ -56,6 +58,7 @@ public class ServerAccordion {
this.serverNames = serverNames;
perServer = container.getValue(PlayerKeys.PER_SERVER)
.orElse(new PerServerContainer());
this.unknown = unknown;
}
public List<Map<String, Object>> asMaps() {
@ -66,7 +69,7 @@ public class ServerAccordion {
DataContainer perServer = entry.getValue();
Map<String, Object> server = new HashMap<>();
String serverName = serverNames.getOrDefault(serverUUID, "Unknown");
String serverName = serverNames.getOrDefault(serverUUID, unknown);
WorldTimes worldTimes = perServer.getValue(PerServerKeys.WORLD_TIMES).orElse(new WorldTimes());
SessionsMutator sessionsMutator = SessionsMutator.forContainer(perServer);

View File

@ -26,6 +26,8 @@ import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DisplaySettings;
import com.djrapitops.plan.settings.config.paths.TimeSettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.GenericLang;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.ServerAggregateQueries;
@ -49,24 +51,27 @@ import java.util.concurrent.TimeUnit;
public class ServerOverviewJSONParser implements ServerTabJSONParser<Map<String, Object>> {
private final Formatter<Long> day;
private PlanConfig config;
private DBSystem dbSystem;
private ServerInfo serverInfo;
private final PlanConfig config;
private final Locale locale;
private final DBSystem dbSystem;
private final ServerInfo serverInfo;
private Formatter<Long> timeAmount;
private Formatter<Double> decimals;
private Formatter<Double> percentage;
private Formatter<DateHolder> year;
private final Formatter<Long> timeAmount;
private final Formatter<Double> decimals;
private final Formatter<Double> percentage;
private final Formatter<DateHolder> year;
private final TimeZone timeZone;
@Inject
public ServerOverviewJSONParser(
PlanConfig config,
Locale locale,
DBSystem dbSystem,
ServerInfo serverInfo,
Formatters formatters
) {
this.config = config;
this.locale = locale;
this.dbSystem = dbSystem;
this.serverInfo = serverInfo;
@ -105,7 +110,7 @@ public class ServerOverviewJSONParser implements ServerTabJSONParser<Map<String,
sevenDays.put("new_players_retention_perc", percentage.apply(retentionPerc7d));
TPSMutator tpsMutator = new TPSMutator(db.query(TPSQueries.fetchTPSDataOfServer(weekAgo, now, serverUUID)));
double averageTPS = tpsMutator.averageTPS();
sevenDays.put("average_tps", averageTPS != -1 ? decimals.apply(averageTPS) : "Unavailable");
sevenDays.put("average_tps", averageTPS != -1 ? decimals.apply(averageTPS) : locale.get(GenericLang.UNAVAILABLE).toString());
sevenDays.put("low_tps_spikes", tpsMutator.lowTpsSpikeCount(config.getNumber(DisplaySettings.GRAPH_TPS_THRESHOLD_MED)));
sevenDays.put("downtime", timeAmount.apply(tpsMutator.serverDownTime()));
@ -146,7 +151,7 @@ public class ServerOverviewJSONParser implements ServerTabJSONParser<Map<String,
? serverInfo.getServerProperties().getOnlinePlayers()
: db.query(TPSQueries.fetchLatestTPSEntryForServer(serverUUID))
.map(TPS::getPlayers).map(Object::toString)
.orElse("Unknown");
.orElse(locale.get(GenericLang.UNKNOWN).toString());
}
private Map<String, Object> createWeeksMap(UUID serverUUID) {

View File

@ -30,22 +30,22 @@ import java.util.Map;
*/
public class ActivityPie extends Pie {
ActivityPie(Map<String, Integer> activityData, String[] colors) {
super(turnToSlices(activityData, colors));
ActivityPie(Map<String, Integer> activityData, String[] colors, String[] groups) {
super(turnToSlices(activityData, colors, groups));
}
private static List<PieSlice> turnToSlices(Map<String, Integer> activityData, String[] colors) {
private static List<PieSlice> turnToSlices(Map<String, Integer> activityData, String[] colors, String[] groups) {
int maxCol = colors.length;
String[] defaultGroups = ActivityIndex.getDefaultGroups();
List<PieSlice> slices = new ArrayList<>();
int i = 0;
for (String group : ActivityIndex.getGroups()) {
int num = activityData.getOrDefault(group, 0);
for (int j = 0; j < groups.length; j++) {
int num = activityData.getOrDefault(defaultGroups[j], 0);
slices.add(new PieSlice(group, num, colors[i % maxCol], false));
slices.add(new PieSlice(groups[j], num, colors[i % maxCol], false));
i++;
}
return slices;
}
}

View File

@ -16,11 +16,14 @@
*/
package com.djrapitops.plan.delivery.rendering.json.graphs.pie;
import com.djrapitops.plan.delivery.domain.mutators.ActivityIndex;
import com.djrapitops.plan.gathering.domain.GMTimes;
import com.djrapitops.plan.gathering.domain.WorldTimes;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.WorldAliasSettings;
import com.djrapitops.plan.settings.config.paths.DisplaySettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.GenericLang;
import com.djrapitops.plan.settings.theme.Theme;
import com.djrapitops.plan.settings.theme.ThemeVal;
@ -38,24 +41,27 @@ import java.util.UUID;
public class PieGraphFactory {
private final PlanConfig config;
private final Locale locale;
private final Theme theme;
@Inject
public PieGraphFactory(
PlanConfig config,
Locale locale,
Theme theme
) {
this.config = config;
this.locale = locale;
this.theme = theme;
}
public Pie activityPie(Map<String, Integer> activityData) {
String[] colors = theme.getPieColors(ThemeVal.GRAPH_ACTIVITY_PIE);
return new ActivityPie(activityData, colors);
return new ActivityPie(activityData, colors, ActivityIndex.getGroups(locale));
}
public Pie serverPreferencePie(Map<UUID, String> serverNames, Map<UUID, WorldTimes> serverWorldTimes) {
return new ServerPreferencePie(serverNames, serverWorldTimes);
return new ServerPreferencePie(serverNames, serverWorldTimes, locale.get(GenericLang.UNKNOWN).toString());
}
public Pie serverPreferencePie(Map<String, Long> serverPlaytimes) {

View File

@ -25,22 +25,22 @@ import java.util.UUID;
public class ServerPreferencePie extends Pie {
ServerPreferencePie(Map<UUID, String> serverNames, Map<UUID, WorldTimes> serverWorldTimes) {
super(turnToSlices(serverNames, serverWorldTimes));
ServerPreferencePie(Map<UUID, String> serverNames, Map<UUID, WorldTimes> serverWorldTimes, String unknown) {
super(turnToSlices(serverNames, serverWorldTimes, unknown));
}
ServerPreferencePie(Map<String, Long> serverPlaytimes) {
super(turnToSlices(serverPlaytimes));
}
private static List<PieSlice> turnToSlices(Map<UUID, String> serverNames, Map<UUID, WorldTimes> serverWorldTimes) {
private static List<PieSlice> turnToSlices(Map<UUID, String> serverNames, Map<UUID, WorldTimes> serverWorldTimes, String unknown) {
List<PieSlice> slices = new ArrayList<>();
for (Map.Entry<UUID, WorldTimes> server : serverWorldTimes.entrySet()) {
UUID serverUUID = server.getKey();
WorldTimes worldTimes = server.getValue();
String serverName = serverNames.getOrDefault(serverUUID, "Unknown");
String serverName = serverNames.getOrDefault(serverUUID, unknown);
long num = worldTimes.getTotal();
slices.add(new PieSlice(serverName, num));

View File

@ -20,7 +20,9 @@ import com.djrapitops.plan.delivery.domain.DateMap;
import com.djrapitops.plan.delivery.domain.mutators.ActivityIndex;
import com.djrapitops.plan.delivery.formatting.Formatter;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
/**
* Stack Graph that represents evolution of the PlayerBase in terms of ActivityIndex Groups.
@ -30,12 +32,8 @@ import java.util.*;
*/
class ActivityStackGraph extends StackGraph {
ActivityStackGraph(TreeMap<Long, Map<String, Set<UUID>>> activityData, String[] colors, Formatter<Long> dayFormatter) {
super(getLabels(activityData.navigableKeySet(), dayFormatter), getDataSets(activityData, colors));
}
ActivityStackGraph(DateMap<Map<String, Integer>> activityData, String[] colors, Formatter<Long> dayFormatter) {
super(getLabels(activityData.navigableKeySet(), dayFormatter), getDataSets(activityData, colors));
ActivityStackGraph(DateMap<Map<String, Integer>> activityData, String[] colors, Formatter<Long> dayFormatter, String[] groups) {
super(getLabels(activityData.navigableKeySet(), dayFormatter), getDataSets(activityData, colors, groups));
}
private static String[] getLabels(Collection<Long> dates, Formatter<Long> dayFormatter) {
@ -55,27 +53,13 @@ class ActivityStackGraph extends StackGraph {
return dataSets;
}
private static StackDataSet[] getDataSets(TreeMap<Long, Map<String, Set<UUID>>> activityData, String[] colors) {
String[] groups = ActivityIndex.getGroups();
StackDataSet[] dataSets = initializeDataSet(groups, colors);
for (Map<String, Set<UUID>> data : activityData.values()) {
for (int j = 0; j < groups.length; j++) {
Set<UUID> players = data.get(groups[j]);
dataSets[j].add(players != null ? players.size() : 0);
}
}
return dataSets;
}
private static StackDataSet[] getDataSets(DateMap<Map<String, Integer>> activityData, String[] colors) {
String[] groups = ActivityIndex.getGroups();
private static StackDataSet[] getDataSets(DateMap<Map<String, Integer>> activityData, String[] colors, String[] groups) {
StackDataSet[] dataSets = initializeDataSet(groups, colors);
String[] defaultGroups = ActivityIndex.getDefaultGroups();
for (Map<String, Integer> data : activityData.values()) {
for (int j = 0; j < groups.length; j++) {
dataSets[j].add((double) data.getOrDefault(groups[j], 0));
dataSets[j].add((double) data.getOrDefault(defaultGroups[j], 0));
}
}

View File

@ -17,8 +17,10 @@
package com.djrapitops.plan.delivery.rendering.json.graphs.stack;
import com.djrapitops.plan.delivery.domain.DateMap;
import com.djrapitops.plan.delivery.domain.mutators.ActivityIndex;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.theme.Theme;
import com.djrapitops.plan.settings.theme.ThemeVal;
@ -34,20 +36,23 @@ import java.util.Map;
@Singleton
public class StackGraphFactory {
private final Locale locale;
private final Theme theme;
private final Formatter<Long> dayFormatter;
@Inject
public StackGraphFactory(
Locale locale,
Formatters formatters,
Theme theme
) {
this.locale = locale;
this.theme = theme;
this.dayFormatter = formatters.dayLong();
}
public StackGraph activityStackGraph(DateMap<Map<String, Integer>> activityData) {
String[] colors = theme.getPieColors(ThemeVal.GRAPH_ACTIVITY_PIE);
return new ActivityStackGraph(activityData, colors, dayFormatter);
return new ActivityStackGraph(activityData, colors, dayFormatter, ActivityIndex.getGroups(locale));
}
}

View File

@ -24,6 +24,9 @@ import com.djrapitops.plan.gathering.domain.Session;
import com.djrapitops.plan.gathering.domain.WorldTimes;
import com.djrapitops.plan.processing.Processing;
import com.djrapitops.plan.settings.config.paths.DisplaySettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.GenericLang;
import com.djrapitops.plan.settings.locale.lang.HtmlLang;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.plugin.utilities.Verify;
@ -47,17 +50,20 @@ public class WorldAliasSettings {
private final Lazy<PlanConfig> config;
private final Supplier<Formatter<Double>> percentageFormatter;
private final Locale locale;
private final Processing processing;
private final ErrorHandler errorHandler;
@Inject
public WorldAliasSettings(
Lazy<PlanConfig> config,
Locale locale,
Lazy<Formatters> formatters,
Processing processing,
ErrorHandler errorHandler
) {
this.config = config;
this.locale = locale;
this.processing = processing;
this.errorHandler = errorHandler;
@ -153,13 +159,13 @@ public class WorldAliasSettings {
ConfigNode aliases = getAliasSection();
if (!session.supports(SessionKeys.WORLD_TIMES)) {
return "No World Time Data";
return locale.get(HtmlLang.UNIT_NO_DATA).toString();
}
WorldTimes worldTimes = session.getValue(SessionKeys.WORLD_TIMES).orElse(new WorldTimes());
if (!session.supports(SessionKeys.END)) {
return worldTimes.getCurrentWorld()
.map(currentWorld -> "Current: " + (aliases.contains(currentWorld) ? aliases.getString(currentWorld) : currentWorld))
.orElse("Current: Unavailable");
.orElse("Current: " + locale.get(GenericLang.UNAVAILABLE));
}
Map<String, Long> playtimePerAlias = getPlaytimePerAlias(worldTimes);

View File

@ -25,6 +25,7 @@ public enum GenericLang implements Lang {
YES("Positive", "Yes"),
NO("Negative", "No"),
UNKNOWN("Unknown", "Unknown"),
UNAVAILABLE("Unavailable", "Unavailable"),
TODAY("Today", "'Today'"),
YESTERDAY("Yesterday", "'Yesterday'");

View File

@ -177,6 +177,7 @@ public enum HtmlLang implements Lang {
LABEL_REGISTERED("Registered"),
TITLE_TITLE_PLAYER_PUNCHCARD("Punchcard"),
TITLE_ALL_TIME("All Time"),
LABEL_NAME("Name"),
// ----------------------------------
// OLD
// ----------------------------------

View File

@ -1,343 +1,344 @@
Cmd - Click Me || 请点击此处
Cmd - Link || §7 •§2 链接§f
Cmd Disable - Disabled || §a现已禁用计划系统。您仍可使用 /planbungee reload 重启插件。
Cmd FAIL - Database not open || §c数据库状态为 ${0} - 请稍后再试.
Cmd FAIL - Invalid Username || §c[数据统计] 此玩家不存在。
Cmd FAIL - No Feature || §e请设置要禁用的功能当前支持 ${0}
Cmd FAIL - No Permission || §c[数据统计] 您没有所需权限。
Cmd FAIL - Require only one Argument || §c[数据统计] 命令需要一个参数。
Cmd FAIL - Requires Arguments || §c[数据统计] 命令缺少参数。${0}
Cmd FAIL - Unknown Username || §c[数据统计] 未在数据库中找到此玩家。
Cmd FAIL - WebUser does not exists || §c用户不存在
Cmd FAIL - WebUser exists || §c用户已存在
Cmd Header - Analysis || §f»§2 玩家统计 - 统计结果
Cmd Header - Info || §f»§2 玩家统计 - 信息
Cmd Header - Inspect || §f»§2 玩家统计 - 检视结果:
Cmd Header - Network || > §2网络页面
Cmd Header - Players || > §2玩家
Cmd Header - Search || §f»§2 玩家统计 - 搜索结果:
Cmd Header - Servers || > §2服务器
Cmd Header - Web Users || > §2${0} 个网页用户
Cmd Info - Bungee Connection || §2已连接至Bungee§f${0}
Cmd Info - Database || §2可用数据库§f${0}
Cmd Info - Reload Complete || §a成功重载插件
Cmd Info - Reload Failed || §c重载插件时发生错误建议重新启动服务器。
Cmd Info - Update || §2更新可用§f${0}
Cmd Info - Version || §2版本§f${0}
Cmd Notify - No WebUser || 您可能还没有网页账户,请输入 /plan register <密码>
Cmd Notify - WebUser register || 已注册新用户:'${0}' 权限级别:${1}
Cmd Qinspect - Activity Index || §2活跃指数§f${0} | ${1}
Cmd Qinspect - Deaths || §2死亡数§f${0}
Cmd Qinspect - Geolocation || §2从 §f${0} 登录
Cmd Qinspect - Last Seen || §2最后在线§f${0}
Cmd Qinspect - Longest Session || §2最长在线时间§f${0}
Cmd Qinspect - Mob Kills || §2怪物击杀数§f${0}
Cmd Qinspect - Player Kills || §2玩家击杀数§f${0}
Cmd Qinspect - Playtime || §2游玩时间§f${0}
Cmd Qinspect - Registered || §2注册时间§f${0}
Cmd Qinspect - Times Kicked || §2踢出次数§f${0}
Cmd SUCCESS - Feature disabled || §a已在下次插件重载前暂时禁用 '${0}'。
Cmd SUCCESS - WebUser register || §a已成功添加新用户${0}您可以在以下链接中查看Web面板。
Cmd WARN - Database not open || §e数据库状态为 ${0} - 可能需要花费更多的时间..
Cmd Web - Permission Levels || >\§70访问所有页面\§71访问 '/players' 及所有玩家页\§72访问用户名与网页用户名一致的玩家页\§73+:无权限
Command Help - /plan analyze || 查看服务器分析
Command Help - /plan dev || 开发模式命令
Command Help - /plan help || 查看命令列表。
Command Help - /plan info || 查看计划版本
Command Help - /plan inspect || 检视玩家数据
Command Help - /plan manage || 数据库管理命令
Command Help - /plan manage backup || 备份数据库至 .db 文件
Command Help - /plan manage clear || 从数据库中清空所有数据
Command Help - /plan manage disable || 暂时禁用功能
Command Help - /plan manage export || 手动导出
Command Help - /plan manage hotswap || 热插拔数据库并重启插件
Command Help - /plan manage import || 从插件中导入数据
Command Help - /plan manage move || 在数据库间移动数据
Command Help - /plan manage raw || 查看玩家数据的raw JSON
Command Help - /plan manage remove || 从活跃数据库中移除玩家数据
Command Help - /plan manage restore || 恢复数据库
Command Help - /plan manage uninstalled || 在数据库中将一个服务器标记为未安装.
Command Help - /plan network || 查看网络页面
Command Help - /plan players || 列出所有已缓存玩家名单
Command Help - /plan qinspect || 在游戏内检视玩家数据
Command Help - /plan register || 注册网页用户
Command Help - /plan reload || 重新启动插件(重载配置)
Command Help - /plan search || 搜索玩家
Command Help - /plan servers || 列出数据库中的服务器
Command Help - /plan web check || 检查网页用户的权限级别。
Command Help - /plan web delete || 删除网页用户
Command Help - /plan web level || 权限级别信息
Command Help - /plan web list || 列出网页用户
Command Help - /plan webuser || 管理网页用户
Command Help - /planbungee disable || 暂时禁用插件
Database - Apply Patch || 正在应用更新:${0}···
Database - Patches Applied || 已成功应用所有数据库补丁。
Database - Patches Applied Already || 已应用所有数据库补丁。
Database MySQL - Launch Options Error || 启动参数出错,正使用默认参数(${0}
Database Notify - Clean || 移除了 ${0} 位用户的数据。
Database Notify - SQLite No WAL || 此服务器版本不支持 SQLite WAL 模式,正使用默认模式。这可能会影响性能。
Disable || 已禁用插件。
Disable - Processing || 正在处理未处理的关键任务。(${0}
Disable - Processing Complete || 处理完毕。
Disable - Unsaved Session Save || 保存未完成的时域中..
Disable - WebServer || 正在关闭网页服务器···
Enable || 已启用插件。
Enable - Database || ${0}-已建立数据库连接。
Enable - Notify Empty IP || server.properties 中的 IP 为空且未使用替代 IP。这将会导致地址出错
Enable - Notify Geolocations disabled || 已关闭地理位置收集。Data.Geolocations: false
Enable - Notify Geolocations Internet Required || 插件需要在首次运行时访问互联网以下载 GeoLite2 地理位置数据库。
Enable - Notify Webserver disabled || 未初始化网页服务器。WebServer.DisableWebServer: true
Enable - WebServer || 正在初始化网页服务器···
Enable FAIL - Database || ${0}-连接数据库失败:${1}
Enable FAIL - Database Patch || 数据库补丁失败,插件必须被禁用。请汇报此问题
Enable FAIL - GeoDB Write || 保存已下载的 GeoLite2 地理位置数据库时发生问题
Enable FAIL - WebServer (Proxy) || 网页服务器未初始化
Enable FAIL - Wrong Database Type || ${0} 此数据类型不存在。
HTML - COMPARING_15_DAYS || 比较15天前
HTML - COMPARING_60_DAYS || 比较30天前
HTML - COMPARING_7_DAYS || 比较7天前
HTML - DATABASE_NOT_OPEN || 数据库未开放, 请输入 /plan info 查看数据库状态
HTML - ERROR || 认证时发生错误
HTML - INDEX_ACTIVE || 活跃
HTML - INDEX_INACTIVE || 不活跃
HTML - INDEX_IRREGULAR || 偶尔上线
HTML - INDEX_REGULAR || 经常上线
HTML - INDEX_VERY_ACTIVE || 非常活跃
HTML - LABEL_1ST_WEAPON || 最致命的PVP武器
HTML - LABEL_2ND_WEAPON || 更致命的武器
HTML - LABEL_3RD_WEAPON || 致命的PvP武器
HTML - LABEL_ACTIVITY_INDEX || 活跃指数
HTML - LABEL_AFK || AFK
HTML - LABEL_AFK_TIME || 挂机时间
HTML - LABEL_AVG || 平均
HTML - LABEL_AVG_KDR || 平均击杀比
HTML - LABEL_AVG_MOB_KDR || 平均怪物击杀比
HTML - LABEL_AVG_PLAYTIME || 平均游戏时间
HTML - LABEL_AVG_SESSION_LENGTH || 平均时域长度
HTML - LABEL_AVG_TPS || 平均TPS
HTML - LABEL_BANNED || 已封禁
HTML - LABEL_BEST_PEAK || 所有时间峰值
HTML - LABEL_DEATHS || 死亡数
HTML - LABEL_DOWNTIME || 停机时间
HTML - LABEL_DURING_LOW_TPS || TPS Spikes:
HTML - LABEL_ENTITIES || 实体数
HTML - LABEL_FAVORITE_SERVER || 喜爱的服务器
HTML - LABEL_FIRST_SESSION_LENGTH || 第一个时域的长度
HTML - LABEL_FREE_DISK_SPACE || 剩余磁盘空间
HTML - LABEL_INACTIVE || 未激活
HTML - LABEL_LAST_PEAK || 上次峰值
HTML - LABEL_LAST_SEEN || 最后在线
HTML - LABEL_LOADED_CHUNKS || 已加载的区块
HTML - LABEL_LOADED_ENTITIES || 已加载的实体
HTML - LABEL_LONE_JOINS || Lone joins
HTML - LABEL_LONE_NEW_JOINS || Lone newbie joins
HTML - LABEL_LONGEST_SESSION || 最长时域
HTML - LABEL_LOW_TPS || 最低TPS Spikes
HTML - LABEL_MOB_DEATHS || 被怪物击杀数
HTML - LABEL_MOB_KDR || 怪物击杀比
HTML - LABEL_MOB_KILLS || 怪物击杀数
HTML - LABEL_MOST_ACTIVE_GAMEMODE || 最常用的游戏模式
HTML - LABEL_NEW || 新
HTML - LABEL_NEW_PLAYERS || 新玩家
HTML - LABEL_NICKNAME || 昵称
HTML - LABEL_ONLINE_FIRST_JOIN || 第一次加入服务器的在线玩家
HTML - LABEL_OPERATOR || 管理员
HTML - LABEL_PER_PLAYER || / 玩家
HTML - LABEL_PER_REGULAR_PLAYER || / 普通玩家
HTML - LABEL_PLAYER_DEATHS || 被玩家击杀数
HTML - LABEL_PLAYER_KILLS || 玩家击杀数
HTML - LABEL_PLAYERS_ONLINE || 在线玩家
HTML - LABEL_PLAYTIME || 游玩时间
HTML - LABEL_REGISTERED || 已注册
HTML - LABEL_REGISTERED_PLAYERS || 已注册的玩家
HTML - LABEL_REGULAR || Regular
HTML - LABEL_REGULAR_PLAYERS || 普通玩家
HTML - LABEL_RETENTION || 新玩家留坑率
HTML - LABEL_SERVER_DOWNTIME || 关服时间
HTML - LABEL_SERVER_OCCUPIED || 开服时间
HTML - LABEL_SESSION_ENDED || 时域之末
HTML - LABEL_SESSION_LENGTH || 时域长度
HTML - LABEL_SESSION_MEDIAN || 平均时域
HTML - LABEL_TIMES_KICKED || 被踢次数
HTML - LABEL_TOTAL_PLAYERS || 总玩家数
HTML - LABEL_TOTAL_PLAYTIME || 总游戏时间
HTML - LABEL_UNIQUE_PLAYERS || 普通玩家
HTML - LINK_BACK_NETWORK || 网络页面
HTML - LINK_BACK_SERVER || 服务器页面
HTML - LINK_CHANGELOG || 查看更新日志
HTML - LINK_DISCORD || Discord支持
HTML - LINK_DOWNLOAD || 下载
HTML - LINK_ISSUES || 提问
HTML - LINK_NIGHT_MODE || 夜晚模式
HTML - LINK_QUICK_VIEW || 快速检索
HTML - LINK_SERVER_ANALYSIS || 服务器分析
HTML - LINK_WIKI || Plan Wiki,教程 & 文档
HTML - LOCAL_MACHINE || 本机
HTML - NAV_PLUGINS || 插件
HTML - NEW_CALENDAR || 新:
HTML - NO_KILLS || 无击杀数
HTML - OFFLINE || 离线
HTML - ONLINE || 在线
HTML - PER_DAY || / 天
HTML - PLAYERS_TEXT || 玩家
HTML - SIDE_GEOLOCATIONS || 地理位置
HTML - SIDE_INFORMATION || 信息
HTML - SIDE_NETWORK_OVERVIEW || 网络预览
HTML - SIDE_OVERVIEW || 预览
HTML - SIDE_PERFORMANCE || 性能
HTML - SIDE_PLAYER_LIST || 玩家列表
HTML - SIDE_PLAYERBASE || Playerbase
HTML - SIDE_PLAYERBASE_OVERVIEW || Playerbase预览
HTML - SIDE_PLUGINS || 插件
HTML - SIDE_PVP_PVE || PvP & PvE
HTML - SIDE_SERVERS || 服务器
HTML - SIDE_SERVERS_TITLE || 服务器
HTML - SIDE_SESSIONS || 时域
HTML - SIDE_TO_MAIN_PAGE || 到主页面
HTML - TEXT_CLICK_TO_EXPAND || 点击拓展
HTML - TEXT_CONTRIBUTORS_CODE || 码农
HTML - TEXT_CONTRIBUTORS_LOCALE || 译者
HTML - TEXT_CONTRIBUTORS_MONEY || 特别感谢那些在经济上支持该插件发展的人.
HTML - TEXT_CONTRIBUTORS_THANKS || 另外以下 <span class="col-plan">awesome people</span> 也为该插件作出了贡献:
HTML - TEXT_DEV_VERSION || 该版本为开发版本.
HTML - TEXT_DEVELOPED_BY || 的开发者为
HTML - TEXT_LICENSED_UNDER || is developed and licensed under
HTML - TEXT_METRICS || bStats Metrics
HTML - TEXT_NO_EXTENSION_DATA || 没有拓展数据
HTML - TEXT_NO_LOW_TPS || No low tps spikes
HTML - TEXT_PLUGIN_INFORMATION || 插件信息
HTML - TEXT_VERSION || 有新版本的插件可用.
HTML - TITLE_30_DAYS || 30 天
HTML - TITLE_30_DAYS_AGO || 30 天前
HTML - TITLE_ALL || 全部
HTML - TITLE_ALL_TIME || 所有时间
HTML - TITLE_AS_NUMBERS || 作为数字
HTML - TITLE_AVG_PING || 平均延迟
HTML - TITLE_BEST_PING || 最低延迟
HTML - TITLE_CALENDAR || 日历
HTML - TITLE_CONNECTION_INFO || 连接信息
HTML - TITLE_COUNTRY || 国家
HTML - TITLE_CPU_RAM || CPU & RAM
HTML - TITLE_CURRENT_PLAYERBASE || 当前玩家
HTML - TITLE_DISK || 磁盘空间
HTML - TITLE_GRAPH_DAY_BY_DAY || Day by Day
HTML - TITLE_GRAPH_NETWORK_ONLINE_ACTIVITY || Network Online Activity
HTML - TITLE_GRAPH_PUNCHCARD || 打卡签到30天
HTML - TITLE_INSIGHTS || Insights30天
HTML - TITLE_IS_AVAILABLE || 可用
HTML - TITLE_LAST_24_HOURS || 过去 24 小时
HTML - TITLE_LAST_30_DAYS || 过去 30 天
HTML - TITLE_LAST_7_DAYS || 过去 7 天
HTML - TITLE_LAST_CONNECTED || 最后连接
HTML - TITLE_LENGTH || 长度
HTML - TITLE_MOST_PLAYED_WORLD || 最多玩家的世界
HTML - TITLE_NETWORK || 服务器网络
HTML - TITLE_NETWORK_AS_NUMBERS || Network as Numbers
HTML - TITLE_NOW || 现在
HTML - TITLE_ONLINE_ACTIVITY || 在线活动
HTML - TITLE_ONLINE_ACTIVITY_AS_NUMBERS || Online Activity as Numbers
HTML - TITLE_ONLINE_ACTIVITY_OVERVIEW || Online Activity Overview
HTML - TITLE_PERFORMANCE_AS_NUMBERS || Performance as Numbers
HTML - TITLE_PING || 延迟
HTML - TITLE_PLAYER || 玩家
HTML - TITLE_PLAYER_OVERVIEW || 玩家预览
HTML - TITLE_PLAYERBASE_DEVELOPMENT || 玩家发展
HTML - TITLE_PVP_DEATHS || 最近的PVP死亡
HTML - TITLE_PVP_KILLS || 最近的PVP击杀
HTML - TITLE_PVP_PVE_NUMBERS || PvP & PvE as Numbers
HTML - TITLE_RECENT_KILLS || 最近击杀
HTML - TITLE_RECENT_SESSIONS || 最近时域
HTML - TITLE_SEEN_NICKNAMES || 可视昵称
HTML - TITLE_SERVER || 服务器
HTML - TITLE_SERVER_AS_NUMBERS || Server as Numbers
HTML - TITLE_SERVER_OVERVIEW || 服务器预览
HTML - TITLE_SERVER_PLAYTIME || 服务器游戏时间
HTML - TITLE_SERVER_PLAYTIME_30 || 服务器30天的游戏时间
HTML - TITLE_SESSION_START || 开始的时域
HTML - TITLE_THEME_SELECT || 选择主题
HTML - TITLE_TITLE_PLAYER_PUNCHCARD || Punchcard
HTML - TITLE_TPS || TPS
HTML - TITLE_TREND || 趋势
HTML - TITLE_TRENDS || 30天趋势
HTML - TITLE_VERSION || 版本
HTML - TITLE_WEEK_COMPARISON || 每周对比
HTML - TITLE_WORLD || 加载世界
HTML - TITLE_WORLD_PLAYTIME || 世界游玩时间
HTML - TITLE_WORST_PING || 最高延迟
HTML - TOTAL_ACTIVE_TEXT || 总活跃玩家
HTML - TOTAL_AFK || 总挂机玩家
HTML - TOTAL_PLAYERS || 总玩家
HTML - UNIQUE_CALENDAR || 普通玩家:
HTML - UNIT_NO_DATA || 没有数据
HTML - UNIT_THE_PLAYERS || 玩家
HTML - USER_AND_PASS_NOT_SPECIFIED || 未指定用户名与密码
HTML - USER_DOES_NOT_EXIST || 用户不存在
HTML - USER_PASS_MISMATCH || 用户名与密码不匹配
HTML - WITH || <th> 与
HTML ERRORS - ACCESS_DENIED_403 || 拒绝访问
HTML ERRORS - AUTH_FAIL_TIPS_401 || - 确保您已使用 <b>/plan register</b> 注册用户<br>- 检查用户名与密码是否正确<br>- 用户名与密码区分大小写<br><br>若您忘记了密码,请让工作人员删除您的旧密码并重新注册。
HTML ERRORS - AUTHENTICATION_FAILED_401 || 认证失败。
HTML ERRORS - FORBIDDEN_403 || 禁止访问
HTML ERRORS - NO_SERVERS_404 || 无可执行此请求的在线服务器。
HTML ERRORS - NOT_FOUND_404 || 未找到
HTML ERRORS - NOT_PLAYED_404 || 玩家从未在此服务器上游玩过。
HTML ERRORS - PAGE_NOT_FOUND_404 || 页面不存在。
HTML ERRORS - UNAUTHORIZED_401 || 未认证
HTML ERRORS - UNKNOWN_PAGE_404 || 请确保您正通过命令所给出的链接访问,示例:</p><p>/player/玩家名<br>/server/服务器名</p>
HTML ERRORS - UUID_404 || 未在数据库中找到玩家的 UUID。
In Depth Help - /plan ? || §2/plan - 主命令\§f 用于访问所有子命令及帮助\§7 /plan - 列出子命令\§7 /plan <子命令> ? - 详细帮助
In Depth Help - /plan analyze ? || §2分析命令\§f 用于刷新分析缓存及访问结果页面\§7 /plan status 可用于在网页在线时检查分析状态fen.\§7 别名analyze, analyse, analysis, a
In Depth Help - /plan inspect ? || §2检视命令\§f 用于获取用户检视页链接。\§7 个人检视页可通过输入 /plan inspect 访问\§7 别名:/plan <名称>
In Depth Help - /plan manage ? || §2管理命令\§f 用于管理插件数据库。\§7 别名:/plan m\§7 /plan m - Auflistung der Unterbefehle\§7 /plan m <子命令> ? - 详细帮助
In Depth Help - /plan manage backup ? || > §2备份命令\ 用于建立新 SQLite 数据库(.db 文件)并包含当前在计划插件文件夹中所有的活跃数据库内容。
In Depth Help - /plan manage clear ? || §2管理清除命令\§f 用于清除活跃数据库中的所有数据。\§7 插件在清理完毕后应被重载。\§7 别名:/plan pl
In Depth Help - /plan manage disable ? || > §2关闭子命令\ Can disable parts of the plugin until next reload.\ Accepted arguments:\ §2kickcount §fDisables kick counts in case /kickall is used on shutdown macro.
In Depth Help - /plan manage export ? || > §2导出子命令\ Trigger export to result folders.\ Accepted Arguments:\ §2list §fList possible arguments.\ §2players §fExport /players, /player pages + /player/raw json depending on config values.\ §2server_json §fExport /server/raw JSON if enabled in config.
In Depth Help - /plan manage import ? || §2管理导入命令\§f 用于从其它来源导入数据\§7 在导入过程中将禁用数据分析。
In Depth Help - /plan manage move ? || > §2移动指令\ 将数据从 SQLite 移动至 MySQL反之亦然。\ 目标数据库将在转移前被清除。
In Depth Help - /plan manage raw ? || > §2Raw数据子命令\ Displays link to raw JSON data page.\ Not available if Plan webserver is not enabled.
In Depth Help - /plan manage remove ? || §2管理移除命令\§f 用于从活跃数据库中移除用户数据。
In Depth Help - /plan manage restore ? || > §2恢复命令\ 从先前备份的 SQLite 数据库中恢复数据(.db 文件)\ 您也可以从其他服务器中恢复 database.db 到 MySQL。\ 目标数据库将在传输前被清除。
In Depth Help - /plan manage uninstalled ? || > §2卸载服务器的子命令\ 在数据库中将一个服务器视为未安装。\ Can not mark the server the command is being used on as uninstalled.\ 将会影响连接系统。
In Depth Help - /plan network ? || > §2网络命令\ 显示到网络页的链接。\ 若不在群组网络上,此页面将显示为服务器页面。
In Depth Help - /plan players ? || > §2玩家命令\ 显示到玩家页的链接。
In Depth Help - /plan qinspect ? || §2快速检视命令\§f 用于获取游戏内关于检视的信息。\§7 相比检视网页有着更少的信息。\§7 别名:/plan qi
In Depth Help - /plan reload ? || > §2重载命令\ 使用 onDisable 与 onEnable 重新载入插件。\ §b不支持运行时热切换插件
In Depth Help - /plan search ? || §2搜索命令\§f 用于获取匹配特定参数的玩家名列表。\§7 示例:/plan search 123 - 搜索名称中包含 123 的所有玩家。
In Depth Help - /plan servers ? || > §2服务器命令\ 显示数据库中的计划服务器列表。\ 可用于调试在网络上数据库注册的问题。
In Depth Help - /plan web ? || < §2网页用户管理命令。\ §2/plan web §f列出子命令\ §2/plan web <子命令> ? §f详细帮助
In Depth Help - /plan web register ? || > §2注册命令\ 注册一位新的网页用户。\ 为其他用户注册需要 plan.webmanage 权限。\ 密码通过使用随机密码盐的 PBKDF2 哈希方法加密(重复 64000 次 SHA1
In Depth Help - /planbungee disable ? || > §2禁用命令\ 在 PlanBungee 上运行 onDisable。\ 插件之后需要运行 /planbungee reload 以重新启用。\ §b不支持运行时热切换插件
Manage - Confirm Overwrite || 数据库 ${0} 中的数据将被覆盖!
Manage - Confirm Removal || 数据库 ${0} 中的数据将被移除!
Manage - Fail || > §c[数据统计] 处理数据时发生错误! ${0}
Manage - Fail File not found || > §c[数据统计] 备份文件不存在! ${0}
Manage - Fail Incorrect Database || > §c'${0}' 不是一个支持的数据库。
Manage - Fail No Exporter || §e导出器 '${0}' 不存在
Manage - Fail No Importer || §e导入器 '${0}' 不存在
Manage - Fail No Server || 找不到这个服务器.
Manage - Fail Same Database || > §c[数据统计] 无法移动至相同的数据库!
Manage - Fail Same server || 无法将服务器标记为未安装 (你已在该服务器)
Manage - Fail, Confirmation || > §c[数据统计] 请添加 -a 以确认执行!${0}
Manage - List Importers || 导入器:
Manage - Remind HotSwap || §e[数据统计] 请切换至新数据库并重载插件(/plan m hotswap ${0}
Manage - Start || »§7 正在处理数据...
Manage - Success || §f» §2 成功!
Negative || 否
Positive || 是
Today || '今天'
Unknown || 未知
Version - DEV || 这是开发版本。
Version - Latest || 您正使用最新版本。
Version - New || 有新版本(${0})可用 ${1}
Version - New (old) || 新版本在 ${0} 可用
Version FAIL - Read info (old) || 无法检查最新版本号
Version FAIL - Read versions.txt || 无法从 Github/versions.txt 加载版本信息
Web User Listing || §2${0} §7§f${1}
WebServer - Notify HTTP || 网页服务器:无证书 -> 正使用 HTTP 服务器提供可视化效果。
WebServer - Notify HTTP User Auth || 网页服务器已禁用用户认证HTTP 方式不安全)
WebServer - Notify no Cert file || 网页服务器:未找到证书密钥存储文件:${0}
WebServer FAIL - Port Bind || 未成功初始化网页服务器。端口(${0})是否被占用?
WebServer FAIL - SSL Context || 网页服务器SSL 环境初始化失败。
WebServer FAIL - Store Load || 网页服务器SSL 证书载入失败。
Yesterday || '昨天'
Cmd - Click Me || 请点击此处
Cmd - Link || §7 •§2 链接§f
Cmd Disable - Disabled || §a现已禁用计划系统。您仍可使用 /planbungee reload 重启插件。
Cmd FAIL - Database not open || §c数据库状态为 ${0} - 请稍后再试.
Cmd FAIL - Invalid Username || §c[数据统计] 此玩家不存在。
Cmd FAIL - No Feature || §e请设置要禁用的功能当前支持 ${0}
Cmd FAIL - No Permission || §c[数据统计] 您没有所需权限。
Cmd FAIL - Require only one Argument || §c[数据统计] 命令需要一个参数。
Cmd FAIL - Requires Arguments || §c[数据统计] 命令缺少参数。${0}
Cmd FAIL - Unknown Username || §c[数据统计] 未在数据库中找到此玩家。
Cmd FAIL - WebUser does not exists || §c用户不存在
Cmd FAIL - WebUser exists || §c用户已存在
Cmd Header - Analysis || §f»§2 玩家统计 - 统计结果
Cmd Header - Info || §f»§2 玩家统计 - 信息
Cmd Header - Inspect || §f»§2 玩家统计 - 检视结果:
Cmd Header - Network || > §2网络页面
Cmd Header - Players || > §2玩家
Cmd Header - Search || §f»§2 玩家统计 - 搜索结果:
Cmd Header - Servers || > §2服务器
Cmd Header - Web Users || > §2${0} 个网页用户
Cmd Info - Bungee Connection || §2已连接至Bungee§f${0}
Cmd Info - Database || §2可用数据库§f${0}
Cmd Info - Reload Complete || §a成功重载插件
Cmd Info - Reload Failed || §c重载插件时发生错误建议重新启动服务器。
Cmd Info - Update || §2更新可用§f${0}
Cmd Info - Version || §2版本§f${0}
Cmd Notify - No WebUser || 您可能还没有网页账户,请输入 /plan register <密码>
Cmd Notify - WebUser register || 已注册新用户:'${0}' 权限级别:${1}
Cmd Qinspect - Activity Index || §2活跃指数§f${0} | ${1}
Cmd Qinspect - Deaths || §2死亡数§f${0}
Cmd Qinspect - Geolocation || §2从 §f${0} 登录
Cmd Qinspect - Last Seen || §2最后在线§f${0}
Cmd Qinspect - Longest Session || §2最长在线时间§f${0}
Cmd Qinspect - Mob Kills || §2怪物击杀数§f${0}
Cmd Qinspect - Player Kills || §2玩家击杀数§f${0}
Cmd Qinspect - Playtime || §2游玩时间§f${0}
Cmd Qinspect - Registered || §2注册时间§f${0}
Cmd Qinspect - Times Kicked || §2踢出次数§f${0}
Cmd SUCCESS - Feature disabled || §a已在下次插件重载前暂时禁用 '${0}'。
Cmd SUCCESS - WebUser register || §a已成功添加新用户${0}您可以在以下链接中查看Web面板。
Cmd WARN - Database not open || §e数据库状态为 ${0} - 可能需要花费更多的时间..
Cmd Web - Permission Levels || >\§70访问所有页面\§71访问 '/players' 及所有玩家页\§72访问用户名与网页用户名一致的玩家页\§73+:无权限
Command Help - /plan analyze || 查看服务器分析
Command Help - /plan dev || 开发模式命令
Command Help - /plan help || 查看命令列表。
Command Help - /plan info || 查看计划版本
Command Help - /plan inspect || 检视玩家数据
Command Help - /plan manage || 数据库管理命令
Command Help - /plan manage backup || 备份数据库至 .db 文件
Command Help - /plan manage clear || 从数据库中清空所有数据
Command Help - /plan manage disable || 暂时禁用功能
Command Help - /plan manage export || 手动导出
Command Help - /plan manage hotswap || 热插拔数据库并重启插件
Command Help - /plan manage import || 从插件中导入数据
Command Help - /plan manage move || 在数据库间移动数据
Command Help - /plan manage raw || 查看玩家数据的raw JSON
Command Help - /plan manage remove || 从活跃数据库中移除玩家数据
Command Help - /plan manage restore || 恢复数据库
Command Help - /plan manage uninstalled || 在数据库中将一个服务器标记为未安装.
Command Help - /plan network || 查看网络页面
Command Help - /plan players || 列出所有已缓存玩家名单
Command Help - /plan qinspect || 在游戏内检视玩家数据
Command Help - /plan register || 注册网页用户
Command Help - /plan reload || 重新启动插件(重载配置)
Command Help - /plan search || 搜索玩家
Command Help - /plan servers || 列出数据库中的服务器
Command Help - /plan web check || 检查网页用户的权限级别。
Command Help - /plan web delete || 删除网页用户
Command Help - /plan web level || 权限级别信息
Command Help - /plan web list || 列出网页用户
Command Help - /plan webuser || 管理网页用户
Command Help - /planbungee disable || 暂时禁用插件
Database - Apply Patch || 正在应用更新:${0}···
Database - Patches Applied || 已成功应用所有数据库补丁。
Database - Patches Applied Already || 已应用所有数据库补丁。
Database MySQL - Launch Options Error || 启动参数出错,正使用默认参数(${0}
Database Notify - Clean || 移除了 ${0} 位用户的数据。
Database Notify - SQLite No WAL || 此服务器版本不支持 SQLite WAL 模式,正使用默认模式。这可能会影响性能。
Disable || 已禁用插件。
Disable - Processing || 正在处理未处理的关键任务。(${0}
Disable - Processing Complete || 处理完毕。
Disable - Unsaved Session Save || 保存未完成的时域中..
Disable - WebServer || 正在关闭网页服务器···
Enable || 已启用插件。
Enable - Database || ${0}-已建立数据库连接。
Enable - Notify Empty IP || server.properties 中的 IP 为空且未使用替代 IP。这将会导致地址出错
Enable - Notify Geolocations disabled || 已关闭地理位置收集。Data.Geolocations: false
Enable - Notify Geolocations Internet Required || 插件需要在首次运行时访问互联网以下载 GeoLite2 地理位置数据库。
Enable - Notify Webserver disabled || 未初始化网页服务器。WebServer.DisableWebServer: true
Enable - WebServer || 正在初始化网页服务器···
Enable FAIL - Database || ${0}-连接数据库失败:${1}
Enable FAIL - Database Patch || 数据库补丁失败,插件必须被禁用。请汇报此问题
Enable FAIL - GeoDB Write || 保存已下载的 GeoLite2 地理位置数据库时发生问题
Enable FAIL - WebServer (Proxy) || 网页服务器未初始化
Enable FAIL - Wrong Database Type || ${0} 此数据类型不存在。
HTML - COMPARING_15_DAYS || 比较15天前
HTML - COMPARING_60_DAYS || 比较30天前
HTML - COMPARING_7_DAYS || 比较7天前
HTML - DATABASE_NOT_OPEN || 数据库未开放, 请输入 /plan info 查看数据库状态
HTML - ERROR || 认证时发生错误
HTML - INDEX_ACTIVE || 活跃
HTML - INDEX_INACTIVE || 不活跃
HTML - INDEX_IRREGULAR || 偶尔上线
HTML - INDEX_REGULAR || 经常上线
HTML - INDEX_VERY_ACTIVE || 非常活跃
HTML - LABEL_1ST_WEAPON || 最致命的PVP武器
HTML - LABEL_2ND_WEAPON || 更致命的武器
HTML - LABEL_3RD_WEAPON || 致命的PvP武器
HTML - LABEL_ACTIVITY_INDEX || 活跃指数
HTML - LABEL_AFK || AFK
HTML - LABEL_AFK_TIME || 挂机时间
HTML - LABEL_AVG || 平均
HTML - LABEL_AVG_KDR || 平均击杀比
HTML - LABEL_AVG_MOB_KDR || 平均怪物击杀比
HTML - LABEL_AVG_PLAYTIME || 平均游戏时间
HTML - LABEL_AVG_SESSION_LENGTH || 平均时域长度
HTML - LABEL_AVG_TPS || 平均TPS
HTML - LABEL_BANNED || 已封禁
HTML - LABEL_BEST_PEAK || 所有时间峰值
HTML - LABEL_DEATHS || 死亡数
HTML - LABEL_DOWNTIME || 停机时间
HTML - LABEL_DURING_LOW_TPS || TPS Spikes:
HTML - LABEL_ENTITIES || 实体数
HTML - LABEL_FAVORITE_SERVER || 喜爱的服务器
HTML - LABEL_FIRST_SESSION_LENGTH || 第一个时域的长度
HTML - LABEL_FREE_DISK_SPACE || 剩余磁盘空间
HTML - LABEL_INACTIVE || 未激活
HTML - LABEL_LAST_PEAK || 上次峰值
HTML - LABEL_LAST_SEEN || 最后在线
HTML - LABEL_LOADED_CHUNKS || 已加载的区块
HTML - LABEL_LOADED_ENTITIES || 已加载的实体
HTML - LABEL_LONE_JOINS || Lone joins
HTML - LABEL_LONE_NEW_JOINS || Lone newbie joins
HTML - LABEL_LONGEST_SESSION || 最长时域
HTML - LABEL_LOW_TPS || 最低TPS Spikes
HTML - LABEL_MOB_DEATHS || 被怪物击杀数
HTML - LABEL_MOB_KDR || 怪物击杀比
HTML - LABEL_MOB_KILLS || 怪物击杀数
HTML - LABEL_MOST_ACTIVE_GAMEMODE || 最常用的游戏模式
HTML - LABEL_NEW || 新
HTML - LABEL_NEW_PLAYERS || 新玩家
HTML - LABEL_NICKNAME || 昵称
HTML - LABEL_ONLINE_FIRST_JOIN || 第一次加入服务器的在线玩家
HTML - LABEL_OPERATOR || 管理员
HTML - LABEL_PER_PLAYER || / 玩家
HTML - LABEL_PER_REGULAR_PLAYER || / 普通玩家
HTML - LABEL_PLAYER_DEATHS || 被玩家击杀数
HTML - LABEL_PLAYER_KILLS || 玩家击杀数
HTML - LABEL_PLAYERS_ONLINE || 在线玩家
HTML - LABEL_PLAYTIME || 游玩时间
HTML - LABEL_REGISTERED || 已注册
HTML - LABEL_REGISTERED_PLAYERS || 已注册的玩家
HTML - LABEL_REGULAR || Regular
HTML - LABEL_REGULAR_PLAYERS || 普通玩家
HTML - LABEL_RETENTION || 新玩家留坑率
HTML - LABEL_SERVER_DOWNTIME || 关服时间
HTML - LABEL_SERVER_OCCUPIED || 开服时间
HTML - LABEL_SESSION_ENDED || 时域之末
HTML - LABEL_SESSION_LENGTH || 时域长度
HTML - LABEL_SESSION_MEDIAN || 平均时域
HTML - LABEL_TIMES_KICKED || 被踢次数
HTML - LABEL_TOTAL_PLAYERS || 总玩家数
HTML - LABEL_TOTAL_PLAYTIME || 总游戏时间
HTML - LABEL_UNIQUE_PLAYERS || 普通玩家
HTML - LINK_BACK_NETWORK || 网络页面
HTML - LINK_BACK_SERVER || 服务器页面
HTML - LINK_CHANGELOG || 查看更新日志
HTML - LINK_DISCORD || Discord支持
HTML - LINK_DOWNLOAD || 下载
HTML - LINK_ISSUES || 提问
HTML - LINK_NIGHT_MODE || 夜晚模式
HTML - LINK_QUICK_VIEW || 快速检索
HTML - LINK_SERVER_ANALYSIS || 服务器分析
HTML - LINK_WIKI || Plan Wiki,教程 & 文档
HTML - LOCAL_MACHINE || 本机
HTML - NAV_PLUGINS || 插件
HTML - NEW_CALENDAR || 新:
HTML - NO_KILLS || 无击杀数
HTML - OFFLINE || 离线
HTML - ONLINE || 在线
HTML - PER_DAY || / 天
HTML - PLAYERS_TEXT || 玩家
HTML - SIDE_GEOLOCATIONS || 地理位置
HTML - SIDE_INFORMATION || 信息
HTML - SIDE_NETWORK_OVERVIEW || 网络预览
HTML - SIDE_OVERVIEW || 预览
HTML - SIDE_PERFORMANCE || 性能
HTML - SIDE_PLAYER_LIST || 玩家列表
HTML - SIDE_PLAYERBASE || Playerbase
HTML - SIDE_PLAYERBASE_OVERVIEW || Playerbase预览
HTML - SIDE_PLUGINS || 插件
HTML - SIDE_PVP_PVE || PvP & PvE
HTML - SIDE_SERVERS || 服务器
HTML - SIDE_SERVERS_TITLE || 服务器
HTML - SIDE_SESSIONS || 时域
HTML - SIDE_TO_MAIN_PAGE || 到主页面
HTML - TEXT_CLICK_TO_EXPAND || 点击拓展
HTML - TEXT_CONTRIBUTORS_CODE || 码农
HTML - TEXT_CONTRIBUTORS_LOCALE || 译者
HTML - TEXT_CONTRIBUTORS_MONEY || 特别感谢那些在经济上支持该插件发展的人.
HTML - TEXT_CONTRIBUTORS_THANKS || 另外以下 <span class="col-plan">awesome people</span> 也为该插件作出了贡献:
HTML - TEXT_DEV_VERSION || 该版本为开发版本.
HTML - TEXT_DEVELOPED_BY || 的开发者为
HTML - TEXT_LICENSED_UNDER || is developed and licensed under
HTML - TEXT_METRICS || bStats Metrics
HTML - TEXT_NO_EXTENSION_DATA || 没有拓展数据
HTML - TEXT_NO_LOW_TPS || No low tps spikes
HTML - TEXT_PLUGIN_INFORMATION || 插件信息
HTML - TEXT_VERSION || 有新版本的插件可用.
HTML - TITLE_30_DAYS || 30 天
HTML - TITLE_30_DAYS_AGO || 30 天前
HTML - TITLE_ALL || 全部
HTML - TITLE_ALL_TIME || 所有时间
HTML - TITLE_AS_NUMBERS || 作为数字
HTML - TITLE_AVG_PING || 平均延迟
HTML - TITLE_BEST_PING || 最低延迟
HTML - TITLE_CALENDAR || 日历
HTML - TITLE_CONNECTION_INFO || 连接信息
HTML - TITLE_COUNTRY || 国家
HTML - TITLE_CPU_RAM || CPU & RAM
HTML - TITLE_CURRENT_PLAYERBASE || 当前玩家
HTML - TITLE_DISK || 磁盘空间
HTML - TITLE_GRAPH_DAY_BY_DAY || Day by Day
HTML - TITLE_GRAPH_NETWORK_ONLINE_ACTIVITY || Network Online Activity
HTML - TITLE_GRAPH_PUNCHCARD || 打卡签到30天
HTML - TITLE_INSIGHTS || Insights30天
HTML - TITLE_IS_AVAILABLE || 可用
HTML - TITLE_LAST_24_HOURS || 过去 24 小时
HTML - TITLE_LAST_30_DAYS || 过去 30 天
HTML - TITLE_LAST_7_DAYS || 过去 7 天
HTML - TITLE_LAST_CONNECTED || 最后连接
HTML - TITLE_LENGTH || 长度
HTML - TITLE_MOST_PLAYED_WORLD || 最多玩家的世界
HTML - TITLE_NETWORK || 服务器网络
HTML - TITLE_NETWORK_AS_NUMBERS || Network as Numbers
HTML - TITLE_NOW || 现在
HTML - TITLE_ONLINE_ACTIVITY || 在线活动
HTML - TITLE_ONLINE_ACTIVITY_AS_NUMBERS || Online Activity as Numbers
HTML - TITLE_ONLINE_ACTIVITY_OVERVIEW || Online Activity Overview
HTML - TITLE_PERFORMANCE_AS_NUMBERS || Performance as Numbers
HTML - TITLE_PING || 延迟
HTML - TITLE_PLAYER || 玩家
HTML - TITLE_PLAYER_OVERVIEW || 玩家预览
HTML - TITLE_PLAYERBASE_DEVELOPMENT || 玩家发展
HTML - TITLE_PVP_DEATHS || 最近的PVP死亡
HTML - TITLE_PVP_KILLS || 最近的PVP击杀
HTML - TITLE_PVP_PVE_NUMBERS || PvP & PvE as Numbers
HTML - TITLE_RECENT_KILLS || 最近击杀
HTML - TITLE_RECENT_SESSIONS || 最近时域
HTML - TITLE_SEEN_NICKNAMES || 可视昵称
HTML - TITLE_SERVER || 服务器
HTML - TITLE_SERVER_AS_NUMBERS || Server as Numbers
HTML - TITLE_SERVER_OVERVIEW || 服务器预览
HTML - TITLE_SERVER_PLAYTIME || 服务器游戏时间
HTML - TITLE_SERVER_PLAYTIME_30 || 服务器30天的游戏时间
HTML - TITLE_SESSION_START || 开始的时域
HTML - TITLE_THEME_SELECT || 选择主题
HTML - TITLE_TITLE_PLAYER_PUNCHCARD || Punchcard
HTML - TITLE_TPS || TPS
HTML - TITLE_TREND || 趋势
HTML - TITLE_TRENDS || 30天趋势
HTML - TITLE_VERSION || 版本
HTML - TITLE_WEEK_COMPARISON || 每周对比
HTML - TITLE_WORLD || 加载世界
HTML - TITLE_WORLD_PLAYTIME || 世界游玩时间
HTML - TITLE_WORST_PING || 最高延迟
HTML - TOTAL_ACTIVE_TEXT || 总活跃玩家
HTML - TOTAL_AFK || 总挂机玩家
HTML - TOTAL_PLAYERS || 总玩家
HTML - UNIQUE_CALENDAR || 普通玩家:
HTML - UNIT_NO_DATA || 没有数据
HTML - UNIT_THE_PLAYERS || 玩家
HTML - USER_AND_PASS_NOT_SPECIFIED || 未指定用户名与密码
HTML - USER_DOES_NOT_EXIST || 用户不存在
HTML - USER_PASS_MISMATCH || 用户名与密码不匹配
HTML - WITH || <th> 与
HTML ERRORS - ACCESS_DENIED_403 || 拒绝访问
HTML ERRORS - AUTH_FAIL_TIPS_401 || - 确保您已使用 <b>/plan register</b> 注册用户<br>- 检查用户名与密码是否正确<br>- 用户名与密码区分大小写<br><br>若您忘记了密码,请让工作人员删除您的旧密码并重新注册。
HTML ERRORS - AUTHENTICATION_FAILED_401 || 认证失败。
HTML ERRORS - FORBIDDEN_403 || 禁止访问
HTML ERRORS - NO_SERVERS_404 || 无可执行此请求的在线服务器。
HTML ERRORS - NOT_FOUND_404 || 未找到
HTML ERRORS - NOT_PLAYED_404 || 玩家从未在此服务器上游玩过。
HTML ERRORS - PAGE_NOT_FOUND_404 || 页面不存在。
HTML ERRORS - UNAUTHORIZED_401 || 未认证
HTML ERRORS - UNKNOWN_PAGE_404 || 请确保您正通过命令所给出的链接访问,示例:</p><p>/player/玩家名<br>/server/服务器名</p>
HTML ERRORS - UUID_404 || 未在数据库中找到玩家的 UUID。
In Depth Help - /plan ? || §2/plan - 主命令\§f 用于访问所有子命令及帮助\§7 /plan - 列出子命令\§7 /plan <子命令> ? - 详细帮助
In Depth Help - /plan analyze ? || §2分析命令\§f 用于刷新分析缓存及访问结果页面\§7 /plan status 可用于在网页在线时检查分析状态fen.\§7 别名analyze, analyse, analysis, a
In Depth Help - /plan inspect ? || §2检视命令\§f 用于获取用户检视页链接。\§7 个人检视页可通过输入 /plan inspect 访问\§7 别名:/plan <名称>
In Depth Help - /plan manage ? || §2管理命令\§f 用于管理插件数据库。\§7 别名:/plan m\§7 /plan m - Auflistung der Unterbefehle\§7 /plan m <子命令> ? - 详细帮助
In Depth Help - /plan manage backup ? || > §2备份命令\ 用于建立新 SQLite 数据库(.db 文件)并包含当前在计划插件文件夹中所有的活跃数据库内容。
In Depth Help - /plan manage clear ? || §2管理清除命令\§f 用于清除活跃数据库中的所有数据。\§7 插件在清理完毕后应被重载。\§7 别名:/plan pl
In Depth Help - /plan manage disable ? || > §2关闭子命令\ Can disable parts of the plugin until next reload.\ Accepted arguments:\ §2kickcount §fDisables kick counts in case /kickall is used on shutdown macro.
In Depth Help - /plan manage export ? || > §2导出子命令\ Trigger export to result folders.\ Accepted Arguments:\ §2list §fList possible arguments.\ §2players §fExport /players, /player pages + /player/raw json depending on config values.\ §2server_json §fExport /server/raw JSON if enabled in config.
In Depth Help - /plan manage import ? || §2管理导入命令\§f 用于从其它来源导入数据\§7 在导入过程中将禁用数据分析。
In Depth Help - /plan manage move ? || > §2移动指令\ 将数据从 SQLite 移动至 MySQL反之亦然。\ 目标数据库将在转移前被清除。
In Depth Help - /plan manage raw ? || > §2Raw数据子命令\ Displays link to raw JSON data page.\ Not available if Plan webserver is not enabled.
In Depth Help - /plan manage remove ? || §2管理移除命令\§f 用于从活跃数据库中移除用户数据。
In Depth Help - /plan manage restore ? || > §2恢复命令\ 从先前备份的 SQLite 数据库中恢复数据(.db 文件)\ 您也可以从其他服务器中恢复 database.db 到 MySQL。\ 目标数据库将在传输前被清除。
In Depth Help - /plan manage uninstalled ? || > §2卸载服务器的子命令\ 在数据库中将一个服务器视为未安装。\ Can not mark the server the command is being used on as uninstalled.\ 将会影响连接系统。
In Depth Help - /plan network ? || > §2网络命令\ 显示到网络页的链接。\ 若不在群组网络上,此页面将显示为服务器页面。
In Depth Help - /plan players ? || > §2玩家命令\ 显示到玩家页的链接。
In Depth Help - /plan qinspect ? || §2快速检视命令\§f 用于获取游戏内关于检视的信息。\§7 相比检视网页有着更少的信息。\§7 别名:/plan qi
In Depth Help - /plan reload ? || > §2重载命令\ 使用 onDisable 与 onEnable 重新载入插件。\ §b不支持运行时热切换插件
In Depth Help - /plan search ? || §2搜索命令\§f 用于获取匹配特定参数的玩家名列表。\§7 示例:/plan search 123 - 搜索名称中包含 123 的所有玩家。
In Depth Help - /plan servers ? || > §2服务器命令\ 显示数据库中的计划服务器列表。\ 可用于调试在网络上数据库注册的问题。
In Depth Help - /plan web ? || < §2网页用户管理命令。\ §2/plan web §f列出子命令\ §2/plan web <子命令> ? §f详细帮助
In Depth Help - /plan web register ? || > §2注册命令\ 注册一位新的网页用户。\ 为其他用户注册需要 plan.webmanage 权限。\ 密码通过使用随机密码盐的 PBKDF2 哈希方法加密(重复 64000 次 SHA1
In Depth Help - /planbungee disable ? || > §2禁用命令\ 在 PlanBungee 上运行 onDisable。\ 插件之后需要运行 /planbungee reload 以重新启用。\ §b不支持运行时热切换插件
Manage - Confirm Overwrite || 数据库 ${0} 中的数据将被覆盖!
Manage - Confirm Removal || 数据库 ${0} 中的数据将被移除!
Manage - Fail || > §c[数据统计] 处理数据时发生错误! ${0}
Manage - Fail File not found || > §c[数据统计] 备份文件不存在! ${0}
Manage - Fail Incorrect Database || > §c'${0}' 不是一个支持的数据库。
Manage - Fail No Exporter || §e导出器 '${0}' 不存在
Manage - Fail No Importer || §e导入器 '${0}' 不存在
Manage - Fail No Server || 找不到这个服务器.
Manage - Fail Same Database || > §c[数据统计] 无法移动至相同的数据库!
Manage - Fail Same server || 无法将服务器标记为未安装 (你已在该服务器)
Manage - Fail, Confirmation || > §c[数据统计] 请添加 -a 以确认执行!${0}
Manage - List Importers || 导入器:
Manage - Remind HotSwap || §e[数据统计] 请切换至新数据库并重载插件(/plan m hotswap ${0}
Manage - Start || »§7 正在处理数据...
Manage - Success || §f» §2 成功!
Negative || 否
Positive || 是
Today || '今天'
Unknown || 未知
Version - DEV || 这是开发版本。
Version - Latest || 您正使用最新版本。
Version - New || 有新版本(${0})可用 ${1}
Version - New (old) || 新版本在 ${0} 可用
Version FAIL - Read info (old) || 无法检查最新版本号
Version FAIL - Read versions.txt || 无法从 Github/versions.txt 加载版本信息
Web User Listing || §2${0} §7§f${1}
WebServer - Notify HTTP || 网页服务器:无证书 -> 正使用 HTTP 服务器提供可视化效果。
WebServer - Notify HTTP User Auth || 网页服务器已禁用用户认证HTTP 方式不安全)
WebServer - Notify no Cert file || 网页服务器:未找到证书密钥存储文件:${0}
WebServer FAIL - Port Bind || 未成功初始化网页服务器。端口(${0})是否被占用?
WebServer FAIL - SSL Context || 网页服务器SSL 环境初始化失败。
WebServer FAIL - Store Load || 网页服务器SSL 证书载入失败。
Yesterday || '昨天'
HTML - LABEL_NAME || 名称

View File

@ -341,3 +341,4 @@ WebServer FAIL - Port Bind || WebServer wurde nicht erfolgr
WebServer FAIL - SSL Context || WebServer: SSL Context Initialisierung fehlgeschlagen.
WebServer FAIL - Store Load || WebServer: SSL Zertifikat konnte nicht geladen werden.
Yesterday || 'Gestern'
HTML - LABEL_NAME || Name

View File

@ -341,3 +341,4 @@ WebServer FAIL - Port Bind || WebServer was not initialized
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
Yesterday || 'Yesterday'
HTML - LABEL_NAME || Name

View File

@ -341,3 +341,4 @@ WebServer FAIL - Port Bind || Web Palvelin ei käynnistynyt
WebServer FAIL - SSL Context || Web Palvelin: SSL Kontekstin käynnistys ei onnistunut.
WebServer FAIL - Store Load || Web Palvelin: SSL Sertifikaatin lataus ei onnistunut.
Yesterday || 'Eilen'
HTML - LABEL_NAME || Nimi

View File

@ -341,3 +341,4 @@ WebServer FAIL - Port Bind || Webサーバーの初期化
WebServer FAIL - SSL Context || Webサーバー: SSLコンテキストの初期化に失敗しました。
WebServer FAIL - Store Load || Webサーバー: SSL証明書のロードに失敗しました
Yesterday || '昨日'
HTML - LABEL_NAME || 名前

View File

@ -341,3 +341,4 @@ WebServer FAIL - Port Bind || O servidor web não foi inici
WebServer FAIL - SSL Context || Servidor Web: Falha ao inicializar certificado SSL.
WebServer FAIL - Store Load || Servidor Web: Falha ao carregar certificado SSL.
Yesterday || 'Ontem'
HTML - LABEL_NAME || Nome

View File

@ -57,7 +57,7 @@ function diskChart(id, series) {
yAxis: {
labels: {
formatter: function () {
return this.value + ' Mb';
return this.value + ' MB';
}
},
softMax: 2,
@ -317,7 +317,7 @@ function resourceChart(id, cpuSeries, ramSeries, playersOnlineSeries) {
}, {
labels: {
formatter: function () {
return this.value + ' Mb';
return this.value + ' MB';
}
}
}],

View File

@ -9,7 +9,7 @@ function loadPingTable(json, error) {
var countries = json;
if (!countries.length) {
pingTable.append('<tr><td>No Ping Data</td><td>-</td><td>-</td><td>-</td></tr>');
pingTable.append('<tr><td>No Data</td><td>-</td><td>-</td><td>-</td></tr>');
return;
}

View File

@ -154,7 +154,7 @@ function loadServerAccordion(json, error) {
var servers = json.servers;
if (!servers.length) {
serverTable.append('<tr><td>No Sessions</td><td>-</td><td>-</td><td>-</td></tr>')
serverTable.append('<tr><td>No Data</td><td>-</td><td>-</td><td>-</td></tr>')
}
var serversHtml = '';

View File

@ -9,7 +9,7 @@ function loadSessionAccordion(json, error) {
var sessions = json.sessions;
if (!sessions.length) {
sessionTable.append('<tr><td>No Sessions</td><td>-</td><td>-</td><td>-</td></tr>');
sessionTable.append('<tr><td>No Data</td><td>-</td><td>-</td><td>-</td></tr>');
return;
}

View File

@ -1348,13 +1348,13 @@
newPlayers: 'New Players',
tps: 'TPS',
cpu: 'CPU Usage (%)',
ram: 'RAM Usage (Mb)',
ram: 'RAM Usage (MB)',
entities: 'Loaded Entities',
chunks: 'Loaded Chunks',
maxPing: 'Worst Ping',
minPing: 'Best Ping',
avgPing: 'Average Ping',
disk: 'Free Disk Space (Mb)'
disk: 'Free Disk Space (MB)'
},
tooltip: {
twoDecimals: {