diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 5c9f819..336707d 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -20,8 +20,8 @@ body:
**Version format:** v[mod_version]+[mod_loader]-[minecraft_version]
- **Version example:** v5.0+fabric-1.26
- **Title example:** [v5.3.1+neoforge-1.26.2] Red "Do not click" button
+ **Version example:** v5.0+fabric-26
+ **Title example:** [v5.3.1+neoforge-26.1.2] Red "Do not click" button
crashes the game when clicked
- type: textarea
id: description
@@ -69,9 +69,8 @@ body:
mod-pack. This helps project maintainers reproduce the issue, as other
mods often can and do cause issues.
placeholder: >-
- Name a list of mods or link a mod-pack here. Please do not expect
- project maintainers to manually download and install like 300 separate
- mods.
+ Name a list of mods or link a mod-pack here. To rule out mod conflicts, it is
+ advised to reproduce the issue without other mods present (except for dependencies).
validations:
required: true
- type: checkboxes
diff --git a/.gitignore b/.gitignore
index dc686f6..a9aa65c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,66 @@
-# -------------------- Eclipse IDE -------------------
+# ==================================================
+# Gradle
+# ==================================================
+.gradle
+**/build/
+!src/**/build/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+# Avoid ignore Gradle wrappper properties
+!gradle-wrapper.properties
+
+# Cache of project
+.gradletasknamecache
+
+# Eclipse Gradle plugin generated files
+# Eclipse Core
+.project
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+# ==================================================
+# Java
+# ==================================================
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+!**/src/main/resources/**/*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+/.gradle/
+/build/
+
+# ==================================================
+# FabricMC
+# ==================================================
+run/
+
+# ==================================================
+# Eclipse IDE
+# ==================================================
.metadata
bin/
tmp/
@@ -60,59 +122,7 @@ local.properties
# Typically, this file would be tracked if it contains build/dependency configurations:
#.project
-# ----------------------- Java -----------------------
-# Compiled class file
-*.class
-
-# Log file
-*.log
-
-# BlueJ files
-*.ctxt
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-!**/src/main/resources/**/*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-/.gradle/
-/build/
-
-# -------------------- Idea IDE -------------------
+# ==================================================
+# IntelliJ Idea IDE
+# ==================================================
**/.idea/
-
-# ----------------------- Gradle -----------------------
-.gradle
-**/build/
-!src/**/build/
-
-# Ignore Gradle GUI config
-gradle-app.setting
-
-# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
-!gradle-wrapper.jar
-
-# Avoid ignore Gradle wrappper properties
-!gradle-wrapper.properties
-
-# Cache of project
-.gradletasknamecache
-
-# Eclipse Gradle plugin generated files
-# Eclipse Core
-.project
-# JDT-specific (Eclipse Java Development Tools)
-.classpath
-
-# ----------------------- Fabric -----------------------
-run/
diff --git a/README.md b/README.md
index 2c9d88e..49eda0e 100644
--- a/README.md
+++ b/README.md
@@ -41,15 +41,15 @@ The vanilla statistics screen is a mess, harder to read and navigate, and lacks
## Dependencies
This mod depends on some other mods that first need to be installed before this mod can be installed. Those dependencies are as follows:
+- 🧵 [Fabric API](https://github.com/FabricMC/fabric-api) (Fabric only) - Loads this mod's assets and resources.
- 🖥 [TCDCommons API](https://github.com/TheCSDev/tcdcommons) - Powers the GUI interface of this mod
-- 🏗 [Architectury API](https://github.com/architectury/architectury-api) - Allows this mod to run on `Fabric` and `NeoForge`
## Building
Follow these steps to build the project from source.
### Prerequisites
-* **Java 21**: Ensure you have the Java Development Kit (JDK) 21 installed.
+* **Java 25**: Ensure you have the Java Development Kit (JDK) installed.
* **Git**: Required to clone this repository.
### Instructions
diff --git a/build.gradle b/build.gradle
index e961972..0c6b85a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'net.fabricmc.fabric-loom' version "1.15-SNAPSHOT"
+ id 'net.fabricmc.fabric-loom' version "1.17-SNAPSHOT"
}
repositories
@@ -14,7 +14,10 @@ dependencies
implementation "net.fabricmc:fabric-loader:${project["fabric.loader_version"]}"
runtimeOnly "net.fabricmc.fabric-api:fabric-api:${project["fabric.api_version"]}"
- implementation "com.terraformersmc:modmenu:18.0.0-alpha.8"
+ implementation("com.terraformersmc:modmenu:${project["modmenu.version"]}") {
+ exclude group: "net.fabricmc", module: "fabric-loader" //causes issues, exclude it
+ exclude group: "net.fabricmc.fabric-api" //causes issues, exclude it
+ }
implementation fileTree(dir: 'src/main/resources/META-INF/jarjar', include: '*.jar')
}
diff --git a/gradle.properties b/gradle.properties
index 3e31d09..3174776 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -11,7 +11,7 @@ maven.group = com.thecsdev
# Mod properties
mod.id = betterstats
-mod.version = 5.3.0
+mod.version = 5.5.5
mod.name = Better Statistics Screen
mod.description = A Minecraft mod that improves the statistics screen and makes it more useful.
mod.author = TheCSDev
@@ -26,14 +26,17 @@ mod.link.curseforge = https://thecsdev.com/fwd/betterstats-curseforge/
mod.link.modrinth = https://thecsdev.com/fwd/betterstats-modrinth/
# 'pack.mcmeta' properties
-pack.format = 84.0
+pack.format = 84
# Minecraft properties
minecraft.version = 26.1
+# Third-party mod versions
+modmenu.version = 18.0.0
+
# Fabric properties
-fabric.loader_version = 0.18.6
-fabric.api_version = 0.145.1+26.1
+fabric.loader_version = 0.18.5
+fabric.api_version = 0.144.0+26.1
# fabric.mod.json properties
fabric.json.entrypoints.main = com.thecsdev.betterstats.fabric.BetterStatsFabric
@@ -43,9 +46,9 @@ fabric.api_version = 0.145.1+26.1
fabric.json.depends.java = >=25
fabric.json.depends.minecraft = ~26.1
- fabric.json.depends.fabricloader = >=0.18.4
- fabric.json.depends.fabric-api = >=0.145.1
- fabric.json.depends.tcdcommons = >=5.3.2
+ fabric.json.depends.fabricloader = >=0.18.5
+ fabric.json.depends.fabric-api = >=0.144.0
+ fabric.json.depends.tcdcommons = >=5.5.5
# Neo-Forge properties
neoforge.version = 26.1.0.7-beta
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 19a6bde..df6a6ad 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,7 +1,9 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
networkTimeout=10000
+retries=0
+retryBackOffMs=500
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/src/main/java/com/thecsdev/betterstats/api/client/gui/screen/BetterStatsConfigScreen.java b/src/main/java/com/thecsdev/betterstats/api/client/gui/screen/BetterStatsConfigScreen.java
index 690341f..b968811 100644
--- a/src/main/java/com/thecsdev/betterstats/api/client/gui/screen/BetterStatsConfigScreen.java
+++ b/src/main/java/com/thecsdev/betterstats/api/client/gui/screen/BetterStatsConfigScreen.java
@@ -26,8 +26,10 @@
import com.thecsdev.commonmc.resource.TLanguage;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
+import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -93,7 +95,7 @@ public static final void initConfigGui(@NotNull TPanelElement panel) throws Null
initStringProperty(
panel,
BLanguage.config_common_apiEndpoint(),
- TTooltip.of(BLanguage.config_common_apiEndpoint_tooltip()),
+ BLanguage.config_common_apiEndpoint_tooltip(),
bss_config.getApiEndpoint().toString(),
(_, _, n) -> {
try { bss_config.setApiEndpoint(URI.create(n));}
@@ -102,13 +104,13 @@ public static final void initConfigGui(@NotNull TPanelElement panel) throws Null
initBooleanProperty(
panel,
BLanguage.config_common_registerCommands(),
- TTooltip.of(BLanguage.config_common_registerCommands_tooltip()),
+ BLanguage.config_common_registerCommands_tooltip(),
bss_config.canRegisterCommands(),
(_, _, n) -> bss_config.setRegisterCommands(n));
initBooleanProperty(
panel,
BLanguage.config_common_experiments(),
- TTooltip.of(BLanguage.config_common_experiments_tooltip()),
+ BLanguage.config_common_experiments_tooltip(),
bss_config.experimentsEnabled(),
(_, _, n) -> bss_config.setExperimentsEnabled(n));
@@ -117,13 +119,13 @@ public static final void initConfigGui(@NotNull TPanelElement panel) throws Null
initBooleanProperty(
panel,
BLanguage.config_client_guiMobsFollowCursor(),
- TTooltip.of(BLanguage.config_client_guiMobsFollowCursor_tooltip()),
+ BLanguage.config_client_guiMobsFollowCursor_tooltip(),
bss_config.getGuiMobsFollowCursor(),
(_, _, n) -> bss_config.setGuiMobsFollowCursor(n));
initBooleanProperty(
panel,
BLanguage.config_client_allowChatPsa(),
- TTooltip.of(BLanguage.config_client_allowChatPsa_tooltip()),
+ BLanguage.config_client_allowChatPsa_tooltip(),
bss_config.allowsChatPsaMessages(),
(_, _, n) -> bss_config.setAllowChatPsaMessages(n));
@@ -144,7 +146,7 @@ public static final void initConfigGui(@NotNull TPanelElement panel) throws Null
initBooleanProperty(
panel,
TLanguage.config_client_updateItemGroupsOnJoin(),
- TTooltip.of(TLanguage.config_client_updateItemGroupsOnJoin_tooltip()),
+ TLanguage.config_client_updateItemGroupsOnJoin_tooltip(),
tcd_config.updateItemGroupsOnJoin(),
(_, _, n) -> tcd_config.setUpdateItemGroupsOnJoin(n));
@@ -204,6 +206,7 @@ private static final void initTableHead(
* Initializes a blank setting slot that has no setting there.
* @param panel The target {@link TPanelElement}.
*/
+ @ApiStatus.Internal
private static final void initNothingSetting(@NotNull TPanelElement panel)
{
//background color element
@@ -224,15 +227,27 @@ private static final void initNothingSetting(@NotNull TPanelElement panel)
* Initializes a boolean property setting.
* @param panel The panel where the setting is to be initialized.
* @param name The display name label text.
- * @param tooltip The tooltip text.
+ * @param tooltipText The tooltip text.
* @param value The current value of the setting.
* @param changeListener Use this to apply setting value changes.
*/
+ @ApiStatus.Internal
private static final void initBooleanProperty(
@NotNull TPanelElement panel,
- @NotNull Component name, @Nullable TTooltip tooltip,
+ @NotNull Component name, @Nullable Component tooltipText,
boolean value, @NotNull IChangeListener changeListener)
{
+ //preparation
+ if(tooltipText != null)
+ tooltipText = Component.literal("")
+ .append(Component.literal("").append(name).withStyle(ChatFormatting.YELLOW))
+ .append("\n")
+ .append(Component.literal("").append(tooltipText).withStyle(ChatFormatting.GRAY));
+ else
+ tooltipText = Component.literal("")
+ .append(Component.literal("").append(name).withStyle(ChatFormatting.YELLOW));
+ final var tooltip = TTooltip.of(tooltipText);
+
//background color element
final var el_bg = new TFillColorElement.Flat((panel.size() % 2 == 0) ? 0x33000000 : 0x44000000, 0);
el_bg.hoverableProperty().set(true, BetterStatsConfigScreen.class);
@@ -258,15 +273,27 @@ private static final void initBooleanProperty(
* Initializes a string property setting.
* @param panel The panel where the setting is to be initialized.
* @param name The display name label text.
- * @param tooltip The tooltip text.
+ * @param tooltipText The tooltip text.
* @param value The current value of the setting.
* @param changeListener Use this to apply setting value changes.
*/
+ @ApiStatus.Internal
private static final void initStringProperty(
@NotNull TPanelElement panel,
- @NotNull Component name, @Nullable TTooltip tooltip,
+ @NotNull Component name, @Nullable Component tooltipText,
@NotNull String value, @NotNull IChangeListener changeListener)
{
+ //preparation
+ if(tooltipText != null)
+ tooltipText = Component.literal("")
+ .append(Component.literal("").append(name).withStyle(ChatFormatting.YELLOW))
+ .append("\n")
+ .append(Component.literal("").append(tooltipText).withStyle(ChatFormatting.GRAY));
+ else
+ tooltipText = Component.literal("")
+ .append(Component.literal("").append(name).withStyle(ChatFormatting.YELLOW));
+ final var tooltip = TTooltip.of(tooltipText);
+
//background color element
final var el_bg = new TFillColorElement.Flat((panel.size() % 2 == 0) ? 0x33000000 : 0x44000000, 0);
el_bg.hoverableProperty().set(true, BetterStatsConfigScreen.class);
diff --git a/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java b/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java
index e9c04bc..3e19f6d 100644
--- a/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java
+++ b/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java
@@ -155,7 +155,6 @@ public final void setCurrentView(@NotNull StatsView view) throws NullPointerExce
/**
* Puts an {@link McbsGoal} into {@link McbsFile#getGoals()}.
* @param goal The {@link McbsGoal} to add.
- * @return {@code true} if the {@link McbsFile} did not already contain the goal.
* @throws NullPointerException If the argument is {@code null}.
*/
public final void putGoal(@NotNull McbsGoal goal) throws NullPointerException
diff --git a/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java b/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java
index 3fc7670..f1d319b 100644
--- a/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java
+++ b/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java
@@ -37,14 +37,15 @@ private McbsStats(
// ==================================================
/**
* Clears redundant statistic data like zero-value entries and empty maps.
+ * @apiNote Costly operation. Avoid frequent calls!
*/
private final @ApiStatus.Internal void cleanUp()
{
//remove zero-value statistic entries
- for(final var statTypeEntry : this.intStats.entrySet())
- statTypeEntry.getValue().entrySet().removeIf(e -> e.getValue() == 0);
+ for(final var statTypeEntry : this.intStats.values())
+ statTypeEntry.values().removeIf(e -> e == 0);
//remove empty stat-type maps
- this.intStats.entrySet().removeIf(e -> e.getValue().isEmpty());
+ this.intStats.values().removeIf(ConcurrentHashMap::isEmpty);
}
// ==================================================
/**
@@ -52,7 +53,6 @@ private McbsStats(
* integer-based statistics values.
*/
public final @NotNull ConcurrentHashMap> getIntValues() {
- cleanUp();
return this.intStats;
}
@@ -66,8 +66,7 @@ private McbsStats(
@NotNull Identifier type) throws NullPointerException
{
Objects.requireNonNull(type);
- cleanUp();
- return this.intStats.computeIfAbsent(type, __ -> new ConcurrentHashMap<>());
+ return this.intStats.computeIfAbsent(type, _ -> new ConcurrentHashMap<>());
}
// ==================================================
/**
@@ -226,7 +225,6 @@ public final void clearAndAddAll(@NotNull IStatsProvider statsProvider) throws N
public final void forEach(@NotNull McbsStats.IntValueConsumer consumer) throws NullPointerException
{
Objects.requireNonNull(consumer);
- cleanUp();
for(final var statTypeEntry : this.intStats.entrySet()) {
final var statTypeId = statTypeEntry.getKey();
for(final var statSubjectEntry : statTypeEntry.getValue().entrySet()) {
@@ -274,6 +272,8 @@ public final void forEach(@NotNull McbsStats.IntValueConsumer consumer) throws N
* {@link Codec} implementation for {@link McbsStats}.
*/
@ApiStatus.Internal
- static final Codec CODEC = CODEC_INT_STATS.xmap(McbsStats::new, McbsStats::getIntValues);
+ static final Codec CODEC = CODEC_INT_STATS.xmap(
+ McbsStats::new,
+ stats -> { stats.cleanUp(); return stats.getIntValues(); });
// ================================================== ==================================================
}
diff --git a/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java b/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java
index 28967fe..9e19f63 100644
--- a/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java
+++ b/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java
@@ -41,6 +41,36 @@ public BetterStatsClient()
//keep track of last login time
ClientEvent.PLAYER_JOIN.addListener(_ -> LAST_LOGIN_TIME = System.currentTimeMillis());
ClientEvent.PLAYER_QUIT.addListener(_ -> LAST_LOGIN_TIME = System.currentTimeMillis());
+
+ //FIXME - REMOVE TEST CODE THAT POPULATES STATS WITH ARBITRARY NUMBERS:
+ /*
+ ClientEvent.PLAYER_JOIN.addListener(_ ->
+ {
+ //obtain singleplayer server
+ final var server = Minecraft.getInstance().getSingleplayerServer();
+ if(server == null) return;
+
+ //continue execution on server-side
+ server.execute(() ->
+ {
+ //obtain the first player (who is usually the main player)
+ final var player = server.getPlayerList().getPlayers().stream().findFirst().orElse(null);
+ if(player == null) return;
+ final var stats = player.getStats();
+ final var rng = new Random();
+
+ //noinspection unchecked | award every single stat in the game to the player
+ for(final var statType : (Registry>)(Object) BuiltInRegistries.STAT_TYPE)
+ {
+ //skip "custom/general" statistics
+ if(((Object) statType) == Stats.CUSTOM) continue;
+ //populate all other stat types
+ for(final var statSubject : statType.getRegistry())
+ stats.setValue(player, statType.get(statSubject), rng.nextInt(0, 1024));
+ }
+ });
+ });
+ */
}
// ==================================================
/**
diff --git a/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java b/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java
index 4c1bd07..b35e706 100644
--- a/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java
+++ b/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java
@@ -23,10 +23,7 @@
import com.thecsdev.commonmc.api.client.gui.widget.TButtonWidget;
import com.thecsdev.commonmc.api.client.gui.widget.TClickableWidget;
import com.thecsdev.commonmc.api.client.gui.widget.stats.TTextualStatWidget;
-import com.thecsdev.commonmc.api.stats.util.BlockStats;
-import com.thecsdev.commonmc.api.stats.util.CustomStat;
-import com.thecsdev.commonmc.api.stats.util.EntityStats;
-import com.thecsdev.commonmc.api.stats.util.ItemStats;
+import com.thecsdev.commonmc.api.stats.util.*;
import com.thecsdev.commonmc.api.util.modinfo.ModInfoProvider;
import com.thecsdev.commonmc.resource.TComponent;
import com.thecsdev.commonmc.resource.TLanguage;
@@ -38,15 +35,11 @@
import net.minecraft.resources.Identifier;
import net.minecraft.stats.StatFormatter;
import net.minecraft.stats.Stats;
-import net.minecraft.world.entity.MobCategory;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
import java.util.concurrent.Future;
import java.util.function.Consumer;
@@ -175,38 +168,13 @@ else if(stat.isTime())
ibmPanel.setBounds(computeNextYBounds(255, GAP));
//featured item statistics
- final var items = ItemStats.getItemStats(lpStats, null, null).stream()
- .sorted(Comparator.comparingDouble(
- (ItemStats obj) -> obj.getValues().values().stream()
- .mapToInt(Integer::intValue)
- .average()
- .orElse(0.0)).reversed())
- .limit(7)
- .toList();
- StatsViewUtils.initItemStats(ibmPanel, null, items);
+ StatsViewUtils.initItemStats(ibmPanel, null, getTopStats(ItemStats.getItemStats(lpStats, null, null), 7));
//featured block statistics
- final var blocks = BlockStats.getBlockStats(lpStats, null, null).stream()
- .sorted(Comparator.comparingDouble(
- (BlockStats obj) -> obj.getValues().values().stream()
- .mapToInt(Integer::intValue)
- .average()
- .orElse(0.0)).reversed())
- .limit(7)
- .toList();
- StatsViewUtils.initBlockStats(ibmPanel, null, blocks);
+ StatsViewUtils.initBlockStats(ibmPanel, null, getTopStats(BlockStats.getBlockStats(lpStats, null, null), 7));
//featured mob statistics
- final var entities = EntityStats.getEntityStats(lpStats, null, null).stream()
- .filter(es -> es.getSubject().getCategory() != MobCategory.MISC)
- .sorted(Comparator.comparingDouble(
- (EntityStats obj) -> obj.getValues().values().stream()
- .mapToInt(Integer::intValue)
- .average()
- .orElse(0.0)).reversed())
- .limit(5)
- .toList();
- StatsViewUtils.initMobStats(ibmPanel, null, entities);
+ StatsViewUtils.initMobStats(ibmPanel, null, getTopStats(EntityStats.getEntityStats(lpStats, null, null), 5));
//and finally, center that panel and add it to this panel
ibmPanel.setBounds(ibmPanel.getContentBounds());
@@ -238,6 +206,56 @@ private final void initNewsAsync()
lbl_group.textScaleProperty().set(1.1d, PersonalHomePanel.class);
news.forEach(section -> CreditsPanel.initSection(this, section));
}
+ // ==================================================
+ /**
+ * Returns a new {@link Collection} containing the "top/largest" stats from another
+ * collection of stats.
+ * @param origin The origin {@link Collection}.
+ * @param size The size of the returned {@link Collection}.
+ * @throws NullPointerException If the argument is {@code null}.
+ * @throws IllegalArgumentException If {@code size < 1}.
+ * @implNote Uses an optimized sorting algorithm that avoids wasteful sort operations.
+ */
+ private static final > @NotNull Collection getTopStats(
+ @NotNull Collection origin, int size)
+ throws NullPointerException, IllegalArgumentException
+ {
+ //check arguments
+ Objects.requireNonNull(origin);
+ if(origin.isEmpty() || size < 1) return new ArrayList<>();
+
+ //define the priority queue that'll be used for stat ranking
+ record RankedStat(S stat, int weight) {}
+ final var queue = new PriorityQueue>(size, Comparator.comparingInt(RankedStat::weight));
+
+ //iterate stats from origin with a single pass
+ for(final var stat : origin)
+ {
+ //calculate total "weight" the current stat is worth
+ int weight = 0;
+ for(final int statVal : stat.getValues().values()) weight += statVal;
+
+ //if the queue is full, check if the current item can fit in
+ if(queue.size() == size) {
+ //a '0' definitely will not fit in the queue
+ if(weight == 0) continue;
+ //compare the score against the lowest rank in the queue
+ final var lowestRank = queue.peek();
+ if(lowestRank != null && weight <= lowestRank.weight)
+ continue; //skip current stat if it ranks below lowest rank
+ }
+
+ //add to queue
+ queue.add(new RankedStat<>(stat, weight));
+ if(queue.size() > size) queue.poll();
+ }
+
+ //return a sorted list containing the ranked elements
+ final var stats = new ArrayList(size);
+ while(stats.size() < size && !queue.isEmpty())
+ stats.add(queue.poll().stat);
+ return stats.reversed();
+ }
// ================================================== ==================================================
// ModSummaryPanel IMPLEMENTATION
// ================================================== ==================================================
diff --git a/src/main/java/com/thecsdev/betterstats/client/gui/screen/McbsSivGoalEditScreen.java b/src/main/java/com/thecsdev/betterstats/client/gui/screen/McbsSivGoalEditScreen.java
index e8e594d..61a0741 100644
--- a/src/main/java/com/thecsdev/betterstats/client/gui/screen/McbsSivGoalEditScreen.java
+++ b/src/main/java/com/thecsdev/betterstats/client/gui/screen/McbsSivGoalEditScreen.java
@@ -8,11 +8,16 @@
import com.thecsdev.betterstats.resource.BLanguage;
import com.thecsdev.common.util.enumerations.CompassDirection;
import com.thecsdev.commonmc.api.client.gui.TElement;
+import com.thecsdev.commonmc.api.client.gui.ctxmenu.TContextMenu;
import com.thecsdev.commonmc.api.client.gui.label.TLabelElement;
+import com.thecsdev.commonmc.api.client.gui.misc.TTextureElement;
import com.thecsdev.commonmc.api.client.gui.panel.TPanelElement;
+import com.thecsdev.commonmc.api.client.gui.widget.TButtonWidget;
import com.thecsdev.commonmc.api.client.gui.widget.TScrollBarWidget;
import com.thecsdev.commonmc.api.client.gui.widget.text.TSimpleTextFieldWidget;
+import com.thecsdev.commonmc.api.stats.IStatsProvider;
import com.thecsdev.commonmc.resource.TLanguage;
+import com.thecsdev.commonmc.resource.TSprites;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.screens.Screen;
@@ -23,9 +28,11 @@
import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.NonNull;
+import java.util.Locale;
import java.util.NoSuchElementException;
import static com.thecsdev.betterstats.api.mcbs.view.statsview.StatsViewUtils.GAP;
+import static net.minecraft.core.registries.BuiltInRegistries.STAT_TYPE;
/**
* Goal editing screen for {@link McbsSivGoal}.
@@ -71,17 +78,42 @@ public McbsSivGoalEditScreen(@Nullable Screen lastScreen, @NotNull McbsEditorFil
//stat type input
StatsViewUtils.initGroupLabel(el_panel, BLanguage.gui_screen_editSivGoal_statType());
final var in_statType = new TSimpleTextFieldWidget();
- in_statType.setBounds(el_panel.computeNextYBounds(20, GAP));
+ in_statType.setBounds(el_panel.computeNextYBounds(20, GAP).add(0, 0, -25, 0));
in_statType.placeholderProperty().set(Component.literal("minecraft:used"), McbsSivGoalEditScreen.class);
in_statType.textProperty().set(goal.getStatType().toString(), McbsSivGoalEditScreen.class);
in_statType.textProperty().addChangeListener((_, _, n) -> {
try {
- goal.setStatType(Identifier.parse(n));
+ goal.setStatType(Identifier.parse(n.trim().toLowerCase(Locale.ROOT)));
refreshPreview();
} catch (RuntimeException ignored) {}
});
el_panel.add(in_statType);
+ final var btn_statType = new TButtonWidget();
+ btn_statType.setBounds(
+ in_statType.getBounds().endX + 5,
+ in_statType.getBounds().y,
+ 20,
+ in_statType.getBounds().height);
+ btn_statType.contextMenuProperty().set(_ ->
+ {
+ final var ctxMenu = new TContextMenu.Builder(getClient());
+ for(final var statType : STAT_TYPE)
+ ctxMenu.addButton(
+ IStatsProvider.getStatTypeName(statType),
+ _ -> in_statType.textProperty().set(
+ String.valueOf(STAT_TYPE.getKey(statType)),
+ McbsSivGoalEditScreen.class));
+ return ctxMenu.build();
+ },
+ McbsSivGoalEditScreen.class);
+ btn_statType.eClicked.addListener(TElement::showContextMenu);
+ el_panel.add(btn_statType);
+
+ final var ico_statType = new TTextureElement(TSprites.gui_widget_dropdownCollapsed());
+ ico_statType.setBounds(btn_statType.getBounds().add(3, 3, -6, -6));
+ el_panel.add(ico_statType);
+
//stat subject input
StatsViewUtils.initGroupLabel(el_panel, BLanguage.gui_screen_editSivGoal_statSubject());
final var in_statSubject = new TSimpleTextFieldWidget();
@@ -90,7 +122,7 @@ public McbsSivGoalEditScreen(@Nullable Screen lastScreen, @NotNull McbsEditorFil
in_statSubject.textProperty().set(goal.getStatSubject().toString(), McbsSivGoalEditScreen.class);
in_statSubject.textProperty().addChangeListener((_, _, n) -> {
try {
- goal.setStatSubject(Identifier.parse(n));
+ goal.setStatSubject(Identifier.parse(n.trim().toLowerCase(Locale.ROOT)));
refreshPreview();
} catch (RuntimeException ignored) {}
});
diff --git a/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemFile.java b/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemFile.java
index 24aae40..b727f14 100644
--- a/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemFile.java
+++ b/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemFile.java
@@ -54,24 +54,24 @@ public final class MenubarItemFile extends MenubarItem
//"Open" option
builder.addButton(
gui(TSprites.gui_icon_fsFolder()).append(" ").append(BLanguage.gui_menubar_file_open()),
- __ -> showOpenFileDialog(client, mcbsEditor));
+ _ -> showOpenFileDialog(client, mcbsEditor));
//"Save as" option
if(mcbsEditor.getCurrentTab() instanceof McbsEditorFileTab)
builder.addButton(air().append(" ").append(
BLanguage.gui_menubar_file_saveAs()),
- __ -> showSaveFileDialog(client, mcbsEditor));
+ _ -> showSaveFileDialog(client, mcbsEditor));
//"Settings" option
builder.addSeparator();
builder.addButton(
gui(BSprites.gui_icon_settings()).append(" ").append(BLanguage.gui_menubar_file_settings()),
- __ -> mcbsEditor.addTab(McbsEditorSettingsTab.INSTANCE, true));
+ _ -> mcbsEditor.addTab(McbsEditorSettingsTab.INSTANCE, true));
//"Close" option
builder.addButton(
gui(BSprites.gui_icon_close()).append(" ").append(BLanguage.gui_menubar_file_close()),
- __ -> Optional.ofNullable(client.screen).ifPresent(Screen::onClose));
+ _ -> Optional.ofNullable(client.screen).ifPresent(Screen::onClose));
//build and return the context menu
return builder.build();
diff --git a/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemView.java b/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemView.java
index 215940c..f0325ce 100644
--- a/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemView.java
+++ b/src/main/java/com/thecsdev/betterstats/mcbs/view/menubar/MenubarItemView.java
@@ -31,7 +31,6 @@ public final class MenubarItemView extends MenubarItem
// ==================================================
public final @Override @NotNull Component getDisplayName() { return BLanguage.gui_menubar_view(); }
// --------------------------------------------------
- @SuppressWarnings("DataFlowIssue")
public final @Override @NotNull TContextMenu createContextMenu(
@NotNull Minecraft client, @NotNull McbsEditor mcbsEditor)
{
@@ -50,7 +49,7 @@ public final class MenubarItemView extends MenubarItem
//the vanilla screen button opens the vanilla stats screen
builder.addButton(
gui("statistics/item_used").append(" ").append(BLanguage.gui_menubar_view_vanillaScreen()),
- __ -> {
+ _ -> {
final @Nullable var player = client.player;
final @Nullable var lastScreen = client.screen;
if(player == null || lastScreen == null) return; //safety - shouldn't happen
@@ -61,13 +60,13 @@ public final class MenubarItemView extends MenubarItem
//home-page tab
builder.addButton(
gui("icon/news").append(" ").append(BLanguage.gui_menubar_view_homepage()),
- __ -> mcbsEditor.addTab(McbsEditorHomepageTab.INSTANCE, true)
+ _ -> mcbsEditor.addTab(McbsEditorHomepageTab.INSTANCE, true)
);
//local-player statistics tab
builder.addButton(
localPlayerComponent.append(" ").append(BLanguage.gui_menubar_view_localPlayerStats()),
- __ -> mcbsEditor.addTab(McbsEditorFileTab.LOCALPLAYER, true)
+ _ -> mcbsEditor.addTab(McbsEditorFileTab.LOCALPLAYER, true)
);
//build and return the context menu
diff --git a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewBlocks.java b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewBlocks.java
index 25bfc7c..b99111c 100644
--- a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewBlocks.java
+++ b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewBlocks.java
@@ -1,13 +1,15 @@
package com.thecsdev.betterstats.mcbs.view.statsview;
+import com.thecsdev.betterstats.BetterStats;
+import com.thecsdev.betterstats.api.mcbs.model.goal.McbsSivGoal;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsView;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsViewUtils;
import com.thecsdev.betterstats.client.gui.panel.StatsPageChooser;
import com.thecsdev.betterstats.client.gui.panel.StatsSummaryPanel;
+import com.thecsdev.betterstats.client.gui.screen.McbsSivGoalEditScreen;
import com.thecsdev.betterstats.resource.BLanguage;
import com.thecsdev.betterstats.resource.BSprites;
import com.thecsdev.common.util.annotations.Virtual;
-import com.thecsdev.commonmc.api.client.gui.TElement;
import com.thecsdev.commonmc.api.client.gui.ctxmenu.TContextMenu;
import com.thecsdev.commonmc.api.client.gui.misc.TTextureElement;
import com.thecsdev.commonmc.api.client.gui.tooltip.TTooltip;
@@ -21,13 +23,16 @@
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.server.permissions.Permissions;
+import net.minecraft.stats.StatType;
import net.minecraft.util.Util;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Items;
+import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.*;
+import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -36,6 +41,8 @@
import static com.thecsdev.commonmc.resource.TComponent.block;
import static com.thecsdev.commonmc.resource.TComponent.gui;
import static java.util.Comparator.comparing;
+import static net.minecraft.core.registries.BuiltInRegistries.BLOCK;
+import static net.minecraft.core.registries.BuiltInRegistries.STAT_TYPE;
import static net.minecraft.network.chat.Component.translatable;
import static net.minecraft.resources.Identifier.DEFAULT_NAMESPACE;
import static net.minecraft.resources.Identifier.fromNamespaceAndPath;
@@ -100,14 +107,15 @@
//obtain stats instance
final var stats = widget.statsProperty().get();
assert stats != null;
- //noinspection unchecked - context menu
- widget.contextMenuProperty().set((Function)(Object) CTX_MENU, StatsViewBlocks.class);
+
+ //context menu
+ widget.contextMenuProperty().set(_ -> CTX_MENU.apply(context, widget), StatsViewBlocks.class);
}
/**
* Constructs a context menu for a given {@link TBlockStatsWidget}.
*/
- private static final Function CTX_MENU = widget ->
+ private static final BiFunction CTX_MENU = (context, widget) ->
{
//obtain the stats data and ensure it is present
final var stats = widget.statsProperty().get();
@@ -115,6 +123,7 @@
//create the context menu builder
final var client = Objects.requireNonNull(widget.getClient(), "Missing 'client' instance");
+ final var tab = context.getTab();
final var builder = new TContextMenu.Builder(client);
//give command
@@ -150,6 +159,50 @@
_ -> Util.getPlatform().openUri(url_wiki));
}
+ //"Create goal" button
+ if(BetterStats.getConfig().experimentsEnabled()) {
+ builder.addContextMenu(
+ gui("container/cartography_table/map").append(" ").append(BLanguage.gui_statsview_stats_ctxMenu_createGoal()),
+ _ ->
+ {
+ //sub-menu for "Create goal"
+ final var ctx_newGoal = new TContextMenu.Builder(client);
+
+ //sub-menu entry for each StatType
+ for(final var statType : STAT_TYPE)
+ {
+ //skip non-Item-related StatType-s
+ if(statType.getRegistry() != BLOCK) continue;
+ //noinspection unchecked
+ final var statTypeB = (StatType) statType;
+
+ ctx_newGoal.addButton(
+ IStatsProvider.getStatTypeName(statTypeB),
+ _ ->
+ {
+ //create and add the goal
+ final int val = stats.getValues().getOrDefault(statTypeB.get(stats.getSubject()), 0);
+ final var goal = new McbsSivGoal(
+ Objects.requireNonNull(STAT_TYPE.getKey(statTypeB)),
+ stats.getSubjectID(),
+ val,
+ val + 64);
+ tab.putGoal(goal);
+
+ //create and open the goal's editing screen
+ final var editScreen = new McbsSivGoalEditScreen(client.screen, tab, goal);
+ client.setScreen(editScreen.getAsScreen());
+
+ //in the background, switch view to goals
+ tab.setCurrentView(StatsViewGoals.INSTANCE);
+ });
+ }
+
+ //build sub-menu
+ return ctx_newGoal.build();
+ });
+ }
+
//close button, and then build and return a new context menu
builder.addButton(
gui(BSprites.gui_icon_close()).append(" ").append(BLanguage.gui_menubar_file_close()),
diff --git a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewGeneral.java b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewGeneral.java
index c91817c..0815773 100644
--- a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewGeneral.java
+++ b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewGeneral.java
@@ -1,10 +1,14 @@
package com.thecsdev.betterstats.mcbs.view.statsview;
+import com.thecsdev.betterstats.BetterStats;
+import com.thecsdev.betterstats.api.mcbs.model.goal.McbsSivGoal;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsView;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsViewUtils;
import com.thecsdev.betterstats.client.gui.panel.StatsPageChooser;
+import com.thecsdev.betterstats.client.gui.screen.McbsSivGoalEditScreen;
import com.thecsdev.betterstats.resource.BLanguage;
import com.thecsdev.betterstats.resource.BSprites;
+import com.thecsdev.commonmc.api.client.gui.ctxmenu.TContextMenu;
import com.thecsdev.commonmc.api.client.gui.misc.TTextureElement;
import com.thecsdev.commonmc.api.client.gui.tooltip.TTooltip;
import com.thecsdev.commonmc.api.client.gui.widget.TDropdownWidget;
@@ -17,16 +21,20 @@
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.stats.StatFormatter;
+import net.minecraft.stats.Stats;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.*;
+import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.thecsdev.betterstats.BetterStats.MOD_ID;
+import static com.thecsdev.commonmc.resource.TComponent.gui;
import static com.thecsdev.commonmc.resource.TComponent.item;
import static java.util.Comparator.comparing;
+import static net.minecraft.core.registries.BuiltInRegistries.STAT_TYPE;
import static net.minecraft.network.chat.Component.literal;
import static net.minecraft.network.chat.Component.translatable;
import static net.minecraft.resources.Identifier.fromNamespaceAndPath;
@@ -92,6 +100,7 @@ public final void postProcessWidget(@NotNull StatsView.StatsInitContext context,
//obtain stat instance
final var stat = widget.statProperty().get();
assert stat != null;
+
//stat formatter overrides
if(stat.isDistance()) {
final var distanceUnit = context.getFilters().getProperty(DistanceUnit.class, DistanceUnit.FID, DistanceUnit.VANILLA);
@@ -101,7 +110,54 @@ else if(stat.isTime()) {
final var timeUnit = context.getFilters().getProperty(TimeUnit.class, TimeUnit.FID, TimeUnit.VANILLA);
widget.formatterOverrideProperty().set(timeUnit.getFormatter(), StatsViewGeneral.class);
}
+
+ //context menu
+ widget.contextMenuProperty().set(_ -> CTX_MENU.apply(context, widget), StatsViewGeneral.class);
}
+
+ /**
+ * Constructs a context menu for a given {@link TCustomStatWidget}.
+ */
+ private static final BiFunction CTX_MENU = (context, widget) ->
+ {
+ //obtain the stats data and ensure it is present
+ final var stat = widget.statProperty().get();
+ assert stat != null;
+
+ //create the context menu builder
+ final var client = Objects.requireNonNull(widget.getClient(), "Missing 'client' instance");
+ final var tab = context.getTab();
+ final var builder = new TContextMenu.Builder(client);
+
+ //"Create goal" button
+ if(BetterStats.getConfig().experimentsEnabled()) {
+ builder.addButton(
+ gui("container/cartography_table/map").append(" ").append(BLanguage.gui_statsview_stats_ctxMenu_createGoal()),
+ _ ->
+ {
+ //create and add the goal
+ final var goal = new McbsSivGoal(
+ Objects.requireNonNull(STAT_TYPE.getKey(Stats.CUSTOM)),
+ stat.getSubjectID(),
+ stat.getValue(),
+ stat.getValue() + 64);
+ tab.putGoal(goal);
+
+ //create and open the goal's editing screen
+ final var editScreen = new McbsSivGoalEditScreen(client.screen, tab, goal);
+ client.setScreen(editScreen.getAsScreen());
+
+ //in the background, switch view to goals
+ tab.setCurrentView(StatsViewGoals.INSTANCE);
+ });
+ }
+
+ //close button, and then build and return a new context menu
+ builder.addButton(
+ gui(BSprites.gui_icon_close()).append(" ").append(BLanguage.gui_menubar_file_close()),
+ _ -> {});
+ return builder.build();
+ };
// --------------------------------------------------
protected final @Override @NotNull Comparator getStatsSorter(@NotNull Filters filters) throws NullPointerException {
return filters.getProperty(SortBy.class, SortBy.FID, SortBy.ALPHABETICAL).getStatsSorter();
diff --git a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewItems.java b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewItems.java
index 1ba380c..6f4d3f1 100644
--- a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewItems.java
+++ b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewItems.java
@@ -1,13 +1,15 @@
package com.thecsdev.betterstats.mcbs.view.statsview;
+import com.thecsdev.betterstats.BetterStats;
+import com.thecsdev.betterstats.api.mcbs.model.goal.McbsSivGoal;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsView;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsViewUtils;
import com.thecsdev.betterstats.client.gui.panel.StatsPageChooser;
import com.thecsdev.betterstats.client.gui.panel.StatsSummaryPanel;
+import com.thecsdev.betterstats.client.gui.screen.McbsSivGoalEditScreen;
import com.thecsdev.betterstats.resource.BLanguage;
import com.thecsdev.betterstats.resource.BSprites;
import com.thecsdev.common.util.annotations.Virtual;
-import com.thecsdev.commonmc.api.client.gui.TElement;
import com.thecsdev.commonmc.api.client.gui.ctxmenu.TContextMenu;
import com.thecsdev.commonmc.api.client.gui.misc.TTextureElement;
import com.thecsdev.commonmc.api.client.gui.tooltip.TTooltip;
@@ -21,12 +23,15 @@
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.server.permissions.Permissions;
+import net.minecraft.stats.StatType;
import net.minecraft.util.Util;
import net.minecraft.world.item.CreativeModeTab;
+import net.minecraft.world.item.Item;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.*;
+import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -34,6 +39,8 @@
import static com.thecsdev.commonmc.api.world.item.TItemUtils.getCreativeModeTab;
import static com.thecsdev.commonmc.resource.TComponent.*;
import static java.util.Comparator.comparing;
+import static net.minecraft.core.registries.BuiltInRegistries.ITEM;
+import static net.minecraft.core.registries.BuiltInRegistries.STAT_TYPE;
import static net.minecraft.network.chat.Component.translatable;
import static net.minecraft.resources.Identifier.DEFAULT_NAMESPACE;
import static net.minecraft.resources.Identifier.fromNamespaceAndPath;
@@ -94,18 +101,20 @@ protected StatsViewItems() {}
* @param widget The newly created {@link TItemStatsWidget}.
* @throws NullPointerException If any of the arguments is {@code null}.
*/
- protected @Virtual void postProcessWidget(@NotNull StatsView.StatsInitContext context, @NotNull TItemStatsWidget widget) {
+ protected @Virtual void postProcessWidget(@NotNull StatsView.StatsInitContext context, @NotNull TItemStatsWidget widget)
+ {
//obtain stats instance
final var stats = widget.statsProperty().get();
assert stats != null;
- //noinspection unchecked - context menu
- widget.contextMenuProperty().set((Function)(Object) CTX_MENU, StatsViewItems.class);
+
+ //context menu
+ widget.contextMenuProperty().set(_ -> CTX_MENU.apply(context, widget), StatsViewItems.class);
}
/**
* Constructs a context menu for a given {@link TItemStatsWidget}.
*/
- private static final Function CTX_MENU = widget ->
+ private static final BiFunction CTX_MENU = (context, widget) ->
{
//obtain the stats data and ensure it is present
final var stats = widget.statsProperty().get();
@@ -113,6 +122,7 @@ protected StatsViewItems() {}
//create the context menu builder
final var client = Objects.requireNonNull(widget.getClient(), "Missing 'client' instance");
+ final var tab = context.getTab();
final var builder = new TContextMenu.Builder(client);
//give command
@@ -142,6 +152,50 @@ protected StatsViewItems() {}
_ -> Util.getPlatform().openUri(url_wiki));
}
+ //"Create goal" button
+ if(BetterStats.getConfig().experimentsEnabled()) {
+ builder.addContextMenu(
+ gui("container/cartography_table/map").append(" ").append(BLanguage.gui_statsview_stats_ctxMenu_createGoal()),
+ _ ->
+ {
+ //sub-menu for "Create goal"
+ final var ctx_newGoal = new TContextMenu.Builder(client);
+
+ //sub-menu entry for each StatType
+ for(final var statType : STAT_TYPE)
+ {
+ //skip non-Item-related StatType-s
+ if(statType.getRegistry() != ITEM) continue;
+ //noinspection unchecked
+ final var statTypeI = (StatType- ) statType;
+
+ ctx_newGoal.addButton(
+ IStatsProvider.getStatTypeName(statTypeI),
+ _ ->
+ {
+ //create and add the goal
+ final int val = stats.getValues().getOrDefault(statTypeI.get(stats.getSubject()), 0);
+ final var goal = new McbsSivGoal(
+ Objects.requireNonNull(STAT_TYPE.getKey(statTypeI)),
+ stats.getSubjectID(),
+ val,
+ val + 64);
+ tab.putGoal(goal);
+
+ //create and open the goal's editing screen
+ final var editScreen = new McbsSivGoalEditScreen(client.screen, tab, goal);
+ client.setScreen(editScreen.getAsScreen());
+
+ //in the background, switch view to goals
+ tab.setCurrentView(StatsViewGoals.INSTANCE);
+ });
+ }
+
+ //build sub-menu
+ return ctx_newGoal.build();
+ });
+ }
+
//close button, and then build and return a new context menu
builder.addButton(
gui(BSprites.gui_icon_close()).append(" ").append(BLanguage.gui_menubar_file_close()),
diff --git a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewMobs.java b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewMobs.java
index 3f82286..0996fd6 100644
--- a/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewMobs.java
+++ b/src/main/java/com/thecsdev/betterstats/mcbs/view/statsview/StatsViewMobs.java
@@ -1,14 +1,15 @@
package com.thecsdev.betterstats.mcbs.view.statsview;
import com.thecsdev.betterstats.BetterStats;
+import com.thecsdev.betterstats.api.mcbs.model.goal.McbsSivGoal;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsView;
import com.thecsdev.betterstats.api.mcbs.view.statsview.StatsViewUtils;
import com.thecsdev.betterstats.client.gui.panel.StatsPageChooser;
import com.thecsdev.betterstats.client.gui.panel.StatsSummaryPanel;
+import com.thecsdev.betterstats.client.gui.screen.McbsSivGoalEditScreen;
import com.thecsdev.betterstats.resource.BLanguage;
import com.thecsdev.betterstats.resource.BSprites;
import com.thecsdev.common.util.annotations.Virtual;
-import com.thecsdev.commonmc.api.client.gui.TElement;
import com.thecsdev.commonmc.api.client.gui.ctxmenu.TContextMenu;
import com.thecsdev.commonmc.api.client.gui.misc.TTextureElement;
import com.thecsdev.commonmc.api.client.gui.screen.TTextDialogScreen;
@@ -23,19 +24,24 @@
import net.fabricmc.api.Environment;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
+import net.minecraft.stats.StatType;
import net.minecraft.util.Util;
+import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
+import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.thecsdev.betterstats.BetterStats.MOD_ID;
import static com.thecsdev.commonmc.resource.TComponent.*;
import static java.util.Comparator.comparing;
+import static net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE;
+import static net.minecraft.core.registries.BuiltInRegistries.STAT_TYPE;
import static net.minecraft.network.chat.Component.literal;
import static net.minecraft.network.chat.Component.translatable;
import static net.minecraft.resources.Identifier.DEFAULT_NAMESPACE;
@@ -103,15 +109,16 @@ protected StatsViewMobs() {}
//obtain stats instance
final var stats = widget.statsProperty().get();
assert stats != null;
- //noinspection unchecked - context menu
- widget.contextMenuProperty().set((Function)(Object) CTX_MENU, StatsViewMobs.class);
+
+ //context menu
+ widget.contextMenuProperty().set(_ -> CTX_MENU.apply(context, widget), StatsViewMobs.class);
widget.followsCursorProperty().set(BetterStats.getConfig().getGuiMobsFollowCursor(), StatsViewMobs.class);
}
/**
* Constructs a context menu for a given {@link TEntityStatsWidget}.
*/
- private static final Function CTX_MENU = widget ->
+ private static final BiFunction CTX_MENU = (context, widget) ->
{
//obtain the stats data and ensure it is present
final var stats = widget.statsProperty().get();
@@ -119,6 +126,7 @@ protected StatsViewMobs() {}
//create the context menu builder
final var client = Objects.requireNonNull(widget.getClient(), "Missing 'client' instance");
+ final var tab = context.getTab();
final var builder = new TContextMenu.Builder(client);
//error information
@@ -142,6 +150,50 @@ protected StatsViewMobs() {}
_ -> Util.getPlatform().openUri(url_wiki));
}
+ //"Create goal" button
+ if(BetterStats.getConfig().experimentsEnabled()) {
+ builder.addContextMenu(
+ gui("container/cartography_table/map").append(" ").append(BLanguage.gui_statsview_stats_ctxMenu_createGoal()),
+ _ ->
+ {
+ //sub-menu for "Create goal"
+ final var ctx_newGoal = new TContextMenu.Builder(client);
+
+ //sub-menu entry for each StatType
+ for(final var statType : STAT_TYPE)
+ {
+ //skip non-Item-related StatType-s
+ if(statType.getRegistry() != ENTITY_TYPE) continue;
+ //noinspection unchecked
+ final var statTypeE = (StatType>) statType;
+
+ ctx_newGoal.addButton(
+ IStatsProvider.getStatTypeName(statTypeE),
+ _ ->
+ {
+ //create and add the goal
+ final int val = stats.getValues().getOrDefault(statTypeE.get(stats.getSubject()), 0);
+ final var goal = new McbsSivGoal(
+ Objects.requireNonNull(STAT_TYPE.getKey(statTypeE)),
+ stats.getSubjectID(),
+ val,
+ val + 64);
+ tab.putGoal(goal);
+
+ //create and open the goal's editing screen
+ final var editScreen = new McbsSivGoalEditScreen(client.screen, tab, goal);
+ client.setScreen(editScreen.getAsScreen());
+
+ //in the background, switch view to goals
+ tab.setCurrentView(StatsViewGoals.INSTANCE);
+ });
+ }
+
+ //build sub-menu
+ return ctx_newGoal.build();
+ });
+ }
+
//close button, and then build and return a new context menu
builder.addButton(
gui(BSprites.gui_icon_close()).append(" ").append(BLanguage.gui_menubar_file_close()),
diff --git a/src/main/java/com/thecsdev/betterstats/resource/BLanguage.java b/src/main/java/com/thecsdev/betterstats/resource/BLanguage.java
index e90dda9..7f5685e 100644
--- a/src/main/java/com/thecsdev/betterstats/resource/BLanguage.java
+++ b/src/main/java/com/thecsdev/betterstats/resource/BLanguage.java
@@ -115,6 +115,7 @@ private BLanguage() {}
public static final MutableComponent gui_statsview_stats_noGoals() { return translatable("betterstats.gui.statsview.stats.no_goals"); }
public static final MutableComponent gui_statsview_stats_ctxMenu_viewErrorInfo() { return translatable("betterstats.gui.statsview.stats.ctxmenu.view_error_info"); }
public static final MutableComponent gui_statsview_stats_ctxMenu_viewOnWiki() { return translatable("betterstats.gui.statsview.stats.ctxmenu.view_on_wiki"); }
+ public static final MutableComponent gui_statsview_stats_ctxMenu_createGoal() { return translatable("betterstats.gui.statsview.stats.ctxmenu.create_goal"); }
public static final MutableComponent gui_statsview_stats_mcbsGoals() { return translatable("betterstats.gui.statsview.mcbs_goals"); }
public static final MutableComponent gui_statsview_stats_mcbsGoals_alert1Prefix() { return translatable("betterstats.gui.statsview.mcbs_goals.alert1.prefix"); }
public static final MutableComponent gui_statsview_stats_mcbsGoals_alert1() { return translatable("betterstats.gui.statsview.mcbs_goals.alert1"); }
diff --git a/src/main/resources/META-INF/jarjar/tcdcommons-5.3.2+fn-26.1.jar b/src/main/resources/META-INF/jarjar/tcdcommons-5.5.5+fn-26.1.jar
similarity index 59%
rename from src/main/resources/META-INF/jarjar/tcdcommons-5.3.2+fn-26.1.jar
rename to src/main/resources/META-INF/jarjar/tcdcommons-5.5.5+fn-26.1.jar
index cdfd7e0..d834a32 100644
Binary files a/src/main/resources/META-INF/jarjar/tcdcommons-5.3.2+fn-26.1.jar and b/src/main/resources/META-INF/jarjar/tcdcommons-5.5.5+fn-26.1.jar differ
diff --git a/src/main/resources/assets/betterstats/lang/bs_ba.json b/src/main/resources/assets/betterstats/lang/bs_ba.json
new file mode 100644
index 0000000..3fb794e
--- /dev/null
+++ b/src/main/resources/assets/betterstats/lang/bs_ba.json
@@ -0,0 +1,198 @@
+{
+ "modmenu.nameTranslation.betterstats": "Better Statistics Screen",
+ "modmenu.summaryTranslation.betterstats": "Minecraft mod koji poboljšava ekran statistike i čini ga korisnijim.",
+
+ "mobCategory.monster": "Čudovišta",
+ "mobCategory.creature": "Stvorenja",
+ "mobCategory.ambient": "Ambijentalna",
+ "mobCategory.axolotls": "Aksolotli",
+ "mobCategory.underground_water_creature": "Podzemna vodena stvorenja",
+ "mobCategory.water_creature": "Vodena stvorenja",
+ "mobCategory.water_ambient": "Vodeni ambijent",
+ "mobCategory.misc": "Razno",
+
+ "stat.blocksButton": "Blokovi",
+ "stat.betterstats.time_since_login": "Vrijeme u ovoj sesiji",
+
+ "commands.statistics.edit.output": "Statistika %s je izmijenjena za %d igrača.",
+ "commands.statistics.clear.output": "Statistike obrisane za %d igrača.",
+ "commands.statistics.clear.kick": "Vaše statistike su obrisane. Zbog toga potrebno je da se ponovo povežete.",
+ "commands.statistics.query.output": "Vrijednost statistike %2$s za %1$s je %3$d.",
+
+ "betterstats.config.common.register_commands": "Registruj komande",
+ "betterstats.config.common.register_commands.tooltip": "Registruje komande ovog moda (npr. '/statistics').",
+ "betterstats.config.common.api_endpoint": "API krajnja tačka",
+ "betterstats.config.common.api_endpoint.tooltip": "TURI adresa RESTful HTTP API krajnje tačke koju ovaj mod koristi za komunikaciju sa serverima autora ovog moda.",
+ "betterstats.config.common.experimental_features": "Eksperimentalne funkcije",
+ "betterstats.config.common.experimental_features.tooltip": "Omogućava eksperimentalne funkcije.\nOve funkcije mogu sadržavati greške, uzrokovati rušenje igre ili dovesti do gubitka podataka. Omogućite ih na vlastitu odgovornost, te zatim ponovo pokrenite igru.\n\nPrisustvo ovakvih funkcija ne znači da će one biti objavljene u konačnoj verziji. Mogu biti uklonjene u bilo kojem trenutku bez prethodne najave.",
+ "betterstats.config.client.allow_chat_psa": "Dozvoli \"PSA\" poruke u chatu",
+ "betterstats.config.client.allow_chat_psa.tooltip": "Dozvoljava da se u chatu povremeno prikazuju informativne \"PSA\" poruke autora ovog moda. Isključite ovu opciju da biste onemogućili sva takva obavještenja.",
+ "betterstats.config.client.gui_mobs_follow_cursor": "Mobovi u GUI-ju prate kursor",
+ "betterstats.config.client.gui_mobs_follow_cursor.tooltip": "Mobovi prikazani u GUI-ju statistike entiteta vizuelno prate položaj kursora.",
+
+ "betterstats.gui.screen.edit_siv_goal.stat_type": "Tip statistike (aktivnost)",
+ "betterstats.gui.screen.edit_siv_goal.stat_subject": "Subjekat statistike (predmet/entitet/itd.)",
+ "betterstats.gui.screen.edit_siv_goal.target_value_range": "Raspon ciljane vrijednosti",
+
+ "betterstats.gui.menubar.file": "Datoteka",
+ "betterstats.gui.menubar.file.new": "Novo",
+ "betterstats.gui.menubar.file.open": "Otvori",
+ "betterstats.gui.menubar.file.save_as": "Sačuvaj kao",
+ "betterstats.gui.menubar.file.settings": "Podešavanja",
+ "betterstats.gui.menubar.file.close": "Zatvori",
+ "betterstats.gui.menubar.view": "Prikaz",
+ "betterstats.gui.menubar.view.vanilla_screen": "Vanilla ekran",
+ "betterstats.gui.menubar.view.homepage": "Početna",
+ "betterstats.gui.menubar.view.local_player_stats": "Moje statistike",
+ "betterstats.gui.menubar.view.stats_view": "Promijeni prikaz",
+ "betterstats.gui.menubar.about": "O modu",
+ "betterstats.gui.menubar.about.source_code": "Izvorni kod",
+ "betterstats.gui.menubar.about.support_me": "Podrži autora",
+ "betterstats.gui.menubar.about.legal_notices": "Pravne napomene",
+
+ "betterstats.gui.statsview.filters": "Filteri",
+ "betterstats.gui.statsview.filter.selected_view": "Izabrani prikaz",
+ "betterstats.gui.statsview.filter.search": "Pretraga",
+ "betterstats.gui.statsview.filter.show_all_stats": "Prikaži sve statistike",
+ "betterstats.gui.statsview.filter.hide_completed_goals": "Sakrij završene ciljeve",
+ "betterstats.gui.statsview.filter.sort_by": "Poredaj po",
+ "betterstats.gui.statsview.filter.group_by": "Grupiši po",
+ "betterstats.gui.statsview.filter.group_by.all": "Sve",
+ "betterstats.gui.statsview.filter.group_by.mod": "Naziv moda",
+ "betterstats.gui.statsview.filter.group_by.mob_category": "Kategorija mobova",
+ "betterstats.gui.statsview.filter.group_by.creative_mode_tab": "Grupa predmeta",
+ "betterstats.gui.statsview.filter.distance_unit": "Jedinica udaljenosti",
+ "betterstats.gui.statsview.filter.time_unit": "Jedinica vremena",
+ "betterstats.gui.statsview.stats.no_stats": "Još nema statistika za prikaz...",
+ "betterstats.gui.statsview.stats.no_goals": "Još nema ciljeva za prikaz...",
+ "betterstats.gui.statsview.stats.ctxmenu.view_error_info": "Prikaži informacije o grešci",
+ "betterstats.gui.statsview.stats.ctxmenu.view_on_wiki": "Pogledaj na Wikiju",
+ "betterstats.gui.statsview.stats.ctxmenu.create_goal": "Kreiraj cilj",
+ "betterstats.gui.statsview.mcbs_goals": "Ciljevi",
+ "betterstats.gui.statsview.mcbs_goals.alert1.prefix": "[Novo ✨]",
+ "betterstats.gui.statsview.mcbs_goals.alert1": "Definišite prilagođene prekretnice za praćenje napretka prema određenim statističkim ciljevima, kao na primjer prikupljanje resursa.",
+ "betterstats.gui.statsview.mcbs_goals.alert2.prefix": "[Napomena 💾]",
+ "betterstats.gui.statsview.mcbs_goals.alert2": "Ovi ciljevi se ne čuvaju nakon ponovnog povezivanja ili ponovnog pokretanja igre. Ova nedostajuća funkcija bi mogla biti dodana u budućnosti.",
+ "betterstats.gui.statsview.mcbs_goals.overview": "Pregled",
+ "betterstats.gui.statsview.mcbs_goals.overview.completed_goals": "Završeni ciljevi",
+ "betterstats.gui.statsview.mcbs_goals.overview.total_progress": "Ukupan napredak",
+ "betterstats.gui.statsview.mcbs_goals.new_btn": "[ + Novi cilj ]",
+ "betterstats.gui.statsview.mcbs_goals.manage_btn": "Upravljaj ciljevima",
+ "betterstats.gui.statsview.mcbs_goals.edit_btn": "Uredi cilj",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn": "Obriši cilj",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn.confirm": "Jeste li sigurni?",
+ "betterstats.gui.statsview.mcbs_goals.no_edit_gui": "Ova vrsta cilja nema interfejs za uređivanje.",
+
+ "betterstats.gui.home_tab.featured_stats": "Istaknute statistike",
+
+ "betterstats.credits": "Zasluge",
+ "betterstats.credits.section.top_sponsors": "Najveći sponzori",
+ "betterstats.credits.section.top_sponsors.summary": "Najveći finansijski doprinosi ovom projektu.",
+ "betterstats.credits.section.recent_sponsors": "Nedavni sponzori",
+ "betterstats.credits.section.recent_sponsors.summary": "Nedavni finansijski doprinosi ovom projektu.",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor": "[+] [Sponzoriši]",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor.summary": "Doprinesite ovom modu i njegovom razvoju ako postanete sponzor.",
+ "betterstats.credits.section.special_thanks": "Posebne zahvale",
+ "betterstats.credits.section.special_thanks.summary": "Posebne zasluge i osobe koje su omogućile ovaj mod.",
+ "betterstats.credits.section.special_thanks.entry.you": "[Ti]",
+ "betterstats.credits.section.special_thanks.entry.you.summary": "Posebne zahvale TEBI za tvoju podršku i pomoć u održavanju ovog moda.",
+ "betterstats.credits.section.special_thanks.entry.contributors": "[Doprinosioci]",
+ "betterstats.credits.section.special_thanks.entry.contributors.summary": "Svi koji su doprinijeli ovom modu, prijavili greške i pružili povratne informacije. Vaša pomoć mnogo znači.",
+ "betterstats.credits.section.contributors": "Doprinosioci",
+ "betterstats.credits.section.contributors.summary": "Članovi zajednice koji su doprinijeli ovom modu tokom verzije v5.X.",
+ "betterstats.credits.section.contributors.entry.contribute": "[+] [Doprinesi]",
+ "betterstats.credits.section.contributors.entry.contribute.summary": "Doprinesite razvoju ovog moda kako biste bili navedeni na ovoj listi.",
+ "betterstats.credits.section.founder_contributors": "Prvi doprinosioci",
+ "betterstats.credits.section.founder_contributors.summary": "Članovi zajednice koji su doprinijeli ovom modu prije verzije v5.X.",
+
+ "betterstats.mcbsgoaltype.betterstats.stat_int_value": "Opšti brojčani cilj",
+
+ "betterstats.mcbsgoal.siv_objective": "%4$d [%1$s] za [%2$s]",
+ "betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal": "Izmjeni ovaj cilj",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom": "Uradi [%2$s] %4$d puta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.broken": "Razbiji %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.crafted": "Napravi %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.dropped": "Ispusti %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.mined": "Izkopaj %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.picked_up": "Pokupi %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.used": "Upotrebi %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed": "Ubij %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed_by": "Umri od %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.animals_bred": "Uzgoji %4$d životinja",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.aviate_one_cm": "Leti %4$d cm sa krilima",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.bell_ring": "Pozvoni %4$d zvona",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.boat_one_cm": "Veslaj čamcem %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_armor": "Očisti %4$d komada oklopa",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_banner": "Očisti %4$d zastava",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_shulker_box": "Očisti %4$d šulker kutija",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm": "Popni se %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm": "Čuči %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed": "Upij %4$d štete",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "Blokiraj %4$d štete štitom",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt": "Nanesi %4$d štete",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed": "Nanesi %4$d štete (Upijeno)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted": "Nanesi %4$d štete (Odbijeno)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_resisted": "Odbij %4$d štete",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_taken": "Primi %4$d štete",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.deaths": "Umri %4$d puta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.drop": "Ispusti %4$d predmeta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.eat_cake_slice": "Pojedi %4$d komada torte",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.enchant_item": "Začaraj %4$d predmeta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fall_one_cm": "Padni %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fill_cauldron": "Napuni %4$d kazana",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fish_caught": "Uhvati %4$d ribe",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fly_one_cm": "Leti %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.happy_ghast_one_cm": "Leti %4$d cm sa srećnim ghastom",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.horse_one_cm": "Putuj %4$d cm sa konjem",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dispenser": "Pretraži %4$d automata",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dropper": "Pretraži %4$d izbacivača",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_hopper": "Pretraži %4$d lijevka",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_anvil": "Koristi %4$d nakovnja",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_beacon": "Koristi %4$d svjetionika",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_blast_furnace": "Koristi %4$d visokih peći",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_brewingstand": "Koristi %4$d postolja za napitke",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_campfire": "Koristi %4$d logorskih vatri",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_cartography_table": "Koristi %4$d kartografskih stolova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_crafting_table": "Koristi %4$d stolova za izradu",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_furnace": "Koristi %4$d peći",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_grindstone": "Koristi %4$d brusnih kamenova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_lectern": "Koristi %4$d govornica",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_loom": "Koristi %4$d razboja",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smithing_table": "Koristi %4$d kovačkih stolova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smoker": "Koristi %4$d pušnica",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_stonecutter": "Koristi %4$d rezača kamena",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.jump": "Skoči %4$d puta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.leave_game": "Izađi iz igre %4$d puta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.minecart_one_cm": "Putuj %4$d cm sa vagonom",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.mob_kills": "Ubij %4$d mobova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.nautilus_one_cm": "Putuj %4$d cm sa nautilusom",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_barrel": "Otvori %4$d bureta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_chest": "Otvori %4$d sanduka",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_enderchest": "Otvori %4$d ender sanduka",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_shulker_box": "Otvori %4$d šulker kutija",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pig_one_cm": "Putuj %4$d cm sa svinjom",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_noteblock": "Sviraj %4$d note blokova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_record": "Pusti %4$d muzičkih ploča",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_time": "Igraj tokom %4$d tikova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.player_kills": "Ubij %4$d igrača",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pot_flower": "Posadi %4$d biljaka u saksijama",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_trigger": "Pokreni %4$d napada",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_win": "Pobjedi %4$d napada",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sleep_in_bed": "Spavaj u %4$d kreveta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sneak_time": "Šunjaj se tokom %4$d tikova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sprint_one_cm": "Triči %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.strider_one_cm": "Putuj %4$d cm sa šetačem",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.swim_one_cm": "Plivaj %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.talked_to_villager": "Razgovaraj sa %4$d seljaka",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.target_hit": "Pogodi %4$d mete",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_death": "Nemoj umrijeti tokom %4$d tokova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_rest": "Nemoj odmarati tokom %4$d tikova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.total_world_time": "Igraj tokom %4$d tikova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.traded_with_villager": "Trguj sa %4$d seljaka",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.trigger_trapped_chest": "Aktiviraj %4$d sanduka sa zamkom",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.tune_noteblock": "Uštimaj %4$d note blokova",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.use_cauldron": "Koristi %4$d kazana",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_on_water_one_cm": "Hodaj %4$d cm po vodi",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_one_cm": "Hodaj %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_under_water_one_cm": "Hodaj %4$d cm pod vodom"
+}
diff --git a/src/main/resources/assets/betterstats/lang/de_de.json b/src/main/resources/assets/betterstats/lang/de_de.json
new file mode 100644
index 0000000..2d7a641
--- /dev/null
+++ b/src/main/resources/assets/betterstats/lang/de_de.json
@@ -0,0 +1,198 @@
+{
+ "modmenu.nameTranslation.betterstats": "Better Statistics Screen",
+ "modmenu.summaryTranslation.betterstats": "Ein Minecraft-Mod, die den Statistikbildschirm verbessert und ihn nützlicher macht.",
+
+ "mobCategory.monster": "Monster",
+ "mobCategory.creature": "Kreaturen",
+ "mobCategory.ambient": "Ambiente",
+ "mobCategory.axolotls": "Axolotl",
+ "mobCategory.underground_water_creature": "Unterwasserkreaturen",
+ "mobCategory.water_creature": "Wasserkreaturen",
+ "mobCategory.water_ambient": "Wasserambiente",
+ "mobCategory.misc": "Verschiedenes",
+
+ "stat.blocksButton": "Blöcke",
+ "stat.betterstats.time_since_login": "Die Dauer dieser Sitzung",
+
+ "commands.statistics.edit.output": "Statistiken %s für %d Spieler(n) bearbeitet.",
+ "commands.statistics.clear.output": "Statistiken von %d Spieler(n) gelöscht.",
+ "commands.statistics.clear.kick": "Deine Statistiken wurden zurückgesetzt, daher wurde die Verbindung abgebrochen und du musst erneut beitreten",
+ "commands.statistics.query.output": "Der Statistikwert von %s für %s beträgt %d.",
+
+ "betterstats.config.common.register_commands": "Befehle registieren",
+ "betterstats.config.common.register_commands.tooltip": "Registriert die Befehle dieser Mod (z. B. '/statistics').",
+ "betterstats.config.common.api_endpoint": "API-Endpunkt",
+ "betterstats.config.common.api_endpoint.tooltip": "Die URI-Adresse des RESTful-HTTP-API-Endpunkts, den diese Mod zur Kommunikation mit den Servern ihres Entwicklers verwendet.",
+ "betterstats.config.common.experimental_features": "Experimentelle Funktionen",
+ "betterstats.config.common.experimental_features.tooltip": "Hier lässt sich festlegen, ob Experimentelle Funtionen aktiviert werden sollen.\nSolche Funktionen können fehlerhaft sein, Abstürze verursachen oder zu Datenverlust führen. Die Aktivierung erfolgt auf eigene Gefahr, starte anschließend das Spiel neu.\n\nDas Vorhandensein dieser Funktionen lässt nicht zwangsläufig auf eine spätere Veröffentlichung schließen. Sie können jederzeit ohne Vorwarnung entfernt werden.",
+ "betterstats.config.client.allow_chat_psa": "Chat-PSA zulassen",
+ "betterstats.config.client.allow_chat_psa.tooltip": "Ermöglicht die Anzeige seltener informativer Nachichten (PSAs) des Mod-Entwicklers im Chat. Deaktivieren Sie diese Option, um alle derartigen Benachrichtigungen zu underdrücken.",
+ "betterstats.config.client.gui_mobs_follow_cursor": "GUI-Mobs folgen folgen dem Cursor",
+ "betterstats.config.client.gui_mobs_follow_cursor.tooltip": "Die GUI für die Entitätsstatistiken folgt visuell der Cursor-Position.",
+
+ "betterstats.gui.screen.edit_siv_goal.stat_type": "Statistiktyp (Aktivität)",
+ "betterstats.gui.screen.edit_siv_goal.stat_subject": "Statistikobjekt (Item/Entität/usw.)",
+ "betterstats.gui.screen.edit_siv_goal.target_value_range": "Zielwertbereich",
+
+ "betterstats.gui.menubar.file": "Datei",
+ "betterstats.gui.menubar.file.new": "Neu",
+ "betterstats.gui.menubar.file.open": "Öffnen",
+ "betterstats.gui.menubar.file.save_as": "Speicher unter",
+ "betterstats.gui.menubar.file.settings": "Einstellungen",
+ "betterstats.gui.menubar.file.close": "Schließen",
+ "betterstats.gui.menubar.view": "Ansicht",
+ "betterstats.gui.menubar.view.vanilla_screen": "Vanilla-Bildschirm",
+ "betterstats.gui.menubar.view.homepage": "Startseite",
+ "betterstats.gui.menubar.view.local_player_stats": "Meine statistiken",
+ "betterstats.gui.menubar.view.stats_view": "Ansicht wechseln",
+ "betterstats.gui.menubar.about": "Über",
+ "betterstats.gui.menubar.about.source_code": "Quellcode",
+ "betterstats.gui.menubar.about.support_me": "Unterstütze mich",
+ "betterstats.gui.menubar.about.legal_notices": "Rechtliche Hinweise",
+
+ "betterstats.gui.statsview.filters": "Filter",
+ "betterstats.gui.statsview.filter.selected_view": "Ausgewählte Ansicht",
+ "betterstats.gui.statsview.filter.search": "Suchen",
+ "betterstats.gui.statsview.filter.show_all_stats": "Alle Statistiken anzeigen",
+ "betterstats.gui.statsview.filter.hide_completed_goals": "Abgeschlossene Ziele ausblenden",
+ "betterstats.gui.statsview.filter.sort_by": "Sortieren nach",
+ "betterstats.gui.statsview.filter.group_by": "Gruppieren nach",
+ "betterstats.gui.statsview.filter.group_by.all": "Alle",
+ "betterstats.gui.statsview.filter.group_by.mod": "Mod-Name",
+ "betterstats.gui.statsview.filter.group_by.mob_category": "Mob-Kategorie",
+ "betterstats.gui.statsview.filter.group_by.creative_mode_tab": "Item-Gruppe",
+ "betterstats.gui.statsview.filter.distance_unit": "Entfernungseinheit",
+ "betterstats.gui.statsview.filter.time_unit": "Zeiteinheit",
+ "betterstats.gui.statsview.stats.no_stats": "Es gibt noch keine Statistiken die angezeigt werden können...",
+ "betterstats.gui.statsview.stats.no_goals": "Es gibt noch keine Ziele die angezeigt werden können...",
+ "betterstats.gui.statsview.stats.ctxmenu.view_error_info": "Fehlerinformationen anzeigen",
+ "betterstats.gui.statsview.stats.ctxmenu.view_on_wiki": "Im Wiki ansehen",
+ "betterstats.gui.statsview.stats.ctxmenu.create_goal": "Ziel erstellen",
+ "betterstats.gui.statsview.mcbs_goals": "Ziele",
+ "betterstats.gui.statsview.mcbs_goals.alert1.prefix": "[Neu ✨]",
+ "betterstats.gui.statsview.mcbs_goals.alert1": "Definieren Sie Benutzerdefinierte Meilensteine, um ihren Fortschritt in Bezug auf bestimmte statistische Kennzahlen wie die Ressourcenerfassung zu verfolgen.",
+ "betterstats.gui.statsview.mcbs_goals.alert2.prefix": "[Notiz 💾]",
+ "betterstats.gui.statsview.mcbs_goals.alert2": "Diese Ziele bleiben nach einem erneuten Beitritt oder Neustart nicht erhalten. Diese fehlende Funktion wird möglicherweise irgendwann implementiert.",
+ "betterstats.gui.statsview.mcbs_goals.overview": "Überblick",
+ "betterstats.gui.statsview.mcbs_goals.overview.completed_goals": "Abgeschlossene Ziele",
+ "betterstats.gui.statsview.mcbs_goals.overview.total_progress": "Gesamtfortschritt",
+ "betterstats.gui.statsview.mcbs_goals.new_btn": "[ + Neues Ziel ]",
+ "betterstats.gui.statsview.mcbs_goals.manage_btn": "Ziele Verwalten",
+ "betterstats.gui.statsview.mcbs_goals.edit_btn": "Ziel bearbeiten",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn": "Ziel löschen",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn.confirm": "Bist du sicher?",
+ "betterstats.gui.statsview.mcbs_goals.no_edit_gui": "Dieser Zieltyp verfügt über keine Berarbeitungsoberfläche.",
+
+ "betterstats.gui.home_tab.featured_stats": "Empfohlene Statistiken",
+
+ "betterstats.credits": "Danksagungen",
+ "betterstats.credits.section.top_sponsors": "Top-Sponsoren",
+ "betterstats.credits.section.top_sponsors.summary": "Wichtigste finanziellen Beiträge für dieses Projekt.",
+ "betterstats.credits.section.recent_sponsors": "Kürzliche Sponsoren",
+ "betterstats.credits.section.recent_sponsors.summary": "Kürzliche finanziellen Beiträge für dieses Projekt.",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor": "[+] [Sponsor werden]",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor.summary": "Trage zu dieser Mod und ihrer Entwicklung bei, indem du Sponsor wirst.",
+ "betterstats.credits.section.special_thanks": "Besonderer Dank",
+ "betterstats.credits.section.special_thanks.summary": "Besonderer Dank gilt denjenigen, die diese Mod möglich gemacht haben.",
+ "betterstats.credits.section.special_thanks.entry.you": "[Du]",
+ "betterstats.credits.section.special_thanks.entry.you.summary": "Ein Besonderer Dank geht an DICH für diene Unterstützung und dafür, dass du dazu beiträgst diese Mod am Weiterleben bringst.",
+ "betterstats.credits.section.special_thanks.entry.contributors": "[Mitwirkende]",
+ "betterstats.credits.section.special_thanks.entry.contributors.summary": "An alle, die zu dieser Mod beigetragen, Fehler gemeldet und Feedback gegeben haben. Eure Hilfe bedeutet mir sehr viel.",
+ "betterstats.credits.section.contributors": "Mitwirkende",
+ "betterstats.credits.section.contributors.summary": "Community-Mitglieder, die während der Version v5.X. zu dieser Mod beigetragen haben",
+ "betterstats.credits.section.contributors.entry.contribute": "[+] [Beitragen]",
+ "betterstats.credits.section.contributors.entry.contribute.summary": "Trage ur Entwicklung dieser Mod bei, um auf dieser Liste genannt zu werden.",
+ "betterstats.credits.section.founder_contributors": "Gründungsbeitragende",
+ "betterstats.credits.section.founder_contributors.summary": "Community-Mitglieder, die vor v5.X. zu dieser Mod beigetragen haben",
+
+ "betterstats.mcbsgoaltype.betterstats.stat_int_value": "Allgemeines numerisches Ziel",
+
+ "betterstats.mcbsgoal.siv_objective": "%4$d [%1$s] für [%2$s]",
+ "betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal": "Dieses Ziel bearbeiten",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom": "[%2$s] %4$d-mal",
+ "betterstats.mcbsgoal.siv_objective.minecraft.broken": "%4$d %2$s zerstören",
+ "betterstats.mcbsgoal.siv_objective.minecraft.crafted": "%4$d %2$s herstellen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.dropped": "%4$d %2$s fallen lassen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.mined": "%4$d %2$s abbauen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.picked_up": "%4$d %2$s aufsammeln",
+ "betterstats.mcbsgoal.siv_objective.minecraft.used": "%4$d %2$s benutzen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed": "%4$d %2$s töten",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed_by": "%4$d-mal durch %2$s sterben",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.animals_bred": "Züchte %4$d Tiere",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.aviate_one_cm": "Fliege %4$d cm mit Elytren",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.bell_ring": "Läute %4$d Glocken",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.boat_one_cm": "Rudere ein Boot %4$d cm weit",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_armor": "Reinige %4$d Rüstungsteile",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_banner": "Reinige %4$d Bannern",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_shulker_box": "Reinige %4$d Shulker-Kiste",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm": "Kletter %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm": "Hocke %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed": "Absorbiere %4$d Schaden",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "Blockiere %4$d Schaden mit einem Schild",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt": "Zufüge %4$d Schaden",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed": "Zufüge %4$d Schaden (Absorbiert)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted": "Zufüge %4$d Schaden (Widergestanden)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_resisted": "Widerstehe %4$d Schaden",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_taken": "Nimm %4$d Schaden",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.deaths": "Sterbe %4$d-Mal",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.drop": "Ablege %4$d Gegenstände",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.eat_cake_slice": "Esse %4$d Kuchenstücke",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.enchant_item": "Verzauber %4$d Gegenstände",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fall_one_cm": "Falle %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fill_cauldron": "Fülle %4$d Kesseln",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fish_caught": "Fange %4$d Fisch",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fly_one_cm": "Fliege %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.happy_ghast_one_cm": "Fliege %4$d cm mit einen Glücklicher-Ghast",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.horse_one_cm": "Reise %4$d cm mit einen Pferd",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dispenser": "Suche %4$d Werfer",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dropper": "Suche %4$d Spender",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_hopper": "Suche %4$d Trichter",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_anvil": "Interagieren mit %4$d Ambosse",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_beacon": "Interagieren mit %4$d Leuchtfeuer",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_blast_furnace": "Interagieren mit %4$d Schmelzöfen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_brewingstand": "Interagieren mit %4$d Braustände",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_campfire": "Interagieren mit %4$d Lagerfeuern",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_cartography_table": "Interagieren mit %4$d Kartentische",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_crafting_table": "Interagieren mit %4$d Werkbänke",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_furnace": "Interagieren mit %4$d Öfen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_grindstone": "Interagieren mit %4$d Schleifsteine",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_lectern": "Interagieren mit %4$d Lesepulte",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_loom": "Interagieren mit %4$d Webstühle",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smithing_table": "Interagieren mit %4$d Schmiedetische",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smoker": "Interagieren mit %4$d Räucheröfen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_stonecutter": "Interagieren mit %4$d Steinsägen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.jump": "Springe %4$d-Mal",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.leave_game": "Verlasse das Spiel %4$d-Mal",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.minecart_one_cm": "Reise %4$d cm mit einer Lore",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.mob_kills": "Töte %4$d Kreaturen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.nautilus_one_cm": "Reise %4$d cm mit einen Nautilus",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_barrel": "Öffne %4$d Fässe",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_chest": "Öffne %4$d Truhen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_enderchest": "Öffne %4$d Endertruhen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_shulker_box": "Öffne %4$d Shulker-Kisten",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pig_one_cm": "Reise %4$d cm mit einen Schwein",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_noteblock": "Spiele %4$d Notenblöcke",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_record": "Spiele %4$d Shallplatten",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_time": "Spiele für %4$d Ticks",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.player_kills": "Töte %4$d Spielern",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pot_flower": "%4$d in Blumentöpfe anpflanzen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_trigger": "Löse %4$d Überfälle",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_win": "Gewinne %4$d Überfälle",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sleep_in_bed": "Schlafe in %4$d Betten",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sneak_time": "Schleiche für %4$d ticks",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sprint_one_cm": "Sprinte %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.strider_one_cm": "Reise %4$d cm mit einen Schreiter",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.swim_one_cm": "Schwimme %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.talked_to_villager": "Rede zu %4$d Dorfbewohnern",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.target_hit": "Treffe %4$d Zielblöcke",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_death": "Sterbe nicht für %4$d Ticks",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_rest": "Ruhe dich nicht aus für %4$d Ticks",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.total_world_time": "Spiele für %4$d Ticks",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.traded_with_villager": "Handel mit %4$d Dorfbewohnern",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.trigger_trapped_chest": "Löse %4$d Redstone-Truhen",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.tune_noteblock": "Stimme %4$d Notenblöcke",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.use_cauldron": "Benutze Kesseln %4$d-Mal",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_on_water_one_cm": "Gehe %4$d cm auf Wasser",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_one_cm": "Gehe %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_under_water_one_cm": "Gehe %4$d cm unterwasser"
+}
diff --git a/src/main/resources/assets/betterstats/lang/docs/index.html b/src/main/resources/assets/betterstats/lang/docs/index.html
new file mode 100644
index 0000000..4449cdb
--- /dev/null
+++ b/src/main/resources/assets/betterstats/lang/docs/index.html
@@ -0,0 +1,809 @@
+
+
+
+
+
+ Better Statistics Screen | Language documentation
+
+
+
+
+
+
Mod description for 'Mod Menu'
+ Name and descriptions for this mod, that show up in Mod Menu.
+
+
+
modmenu.nameTranslation.betterstats
+ The display name of the mod within the 'Mod Menu' interface.
+
+
+
+
+
modmenu.summaryTranslation.betterstats
+ The summary description of the mod within the 'Mod Menu' interface.
+
+
+
+
+ Mob categories
+
+ Much like how items have their own corresponding creative mode tabs, mobs too have their categories. The following
+ language texts aim to give those categories user-friendly names.
+
+
+
+
mobCategory.monster
+ Hostile creatures like zombies, skeletons, creepers, blazes, etc.
+
+
+
+
+
mobCategory.creature
+ Friendly creatures like pigs, cows, sheep, foxes, striders, etc.
+
+
+
+
+
mobCategory.ambient
+ As of
26.1.2, it contains only 1 mob; bat. There could be more in the future.
+
+
+
+
+
mobCategory.axolotls
+ As of
26.1.2, it contains only 1 mob; axolotl. There could be more in the future.
+
+
+
+
+
mobCategory.underground_water_creature
+ As of
26.1.2, it contains only 1 mob; glow squid. There could be more in the future.
+
+
+
+
+
mobCategory.water_creature
+ For creatures who call the underwater their home.
+
+
+
+
+
mobCategory.water_ambient
+ Underwater ambient creatures, like fish.
+
+
+
+
+
mobCategory.misc
+ Miscellaneous entities, typically ones that aren't "alive". Includes stuff like boats, minecarts, armor stands,
+ snowballs, etc.
+
+
+
+
+ Statistics
+
+
+
stat.blocksButton
+ The vanilla game has "General", "Items", and "Mobs" buttons/menus. This mod has an additional one; "Blocks".
+ This additional section allows users to see their statistics related specifically to blocks.
+
+
+
+
+
stat.betterstats.time_since_login
+ Name of the
betterstats:time_since_login general/custom stat. This temporal stat tracks how long
+ the player's current session is.
+
+
+
+
+ /statistics & /stats command
+
+
+
commands.statistics.edit.output
+ Output for the
/statistics edit command.
+
+
+
+
+
commands.statistics.clear.output
+ Output for the
/statistics clear command.
+
+
+
+
+
commands.statistics.clear.kick
+ The
/statistics clear command kicks players whose statistics are cleared. This mechanism
+ prevents client/server desync issues with statistics. When a player is kicked for this reason, this
+ is the message that shows up on their screen.
+
+
+
+
+
commands.statistics.query.output
+ Output for the
/statistics query command.
+
+
+
+
+ Configurations/Settings related to this mod
+ Language texts used when presenting the user with a GUI interface to configure this mod.
+
+
+
betterstats.config.common.register_commands
+ User-friendly name of the "Register commands" property.
+
+
+
+
+
betterstats.config.common.register_commands.tooltip
+ User-friendly description of the "Register commands" property.
+
+
+
+
+
betterstats.config.common.api_endpoint
+ User-friendly name of the "API endpoint" property.
+
+
+
+
+
betterstats.config.common.api_endpoint.tooltip
+ User-friendly description of the "API endpoint" property.
+
+
+
+
+
betterstats.config.common.experimental_features
+ User-friendly name of the "Experimental features" property.
+
+
+
+
+
betterstats.config.common.experimental_features.tooltip
+ User-friendly description of the "Experimental features" property.
+
+
+
+
+
betterstats.config.client.allow_chat_psa
+ User-friendly name of the "Allow chat PSA messages" property.
+
+
+
+
+
betterstats.config.client.allow_chat_psa.tooltip
+ User-friendly description of the "Allow chat PSA messages" property.
+
+
+
+
+
betterstats.config.client.gui_mobs_follow_cursor
+ User-friendly name of the "GUI mobs follow cursor" property.
+
+
+
+
+
betterstats.config.client.gui_mobs_follow_cursor.tooltip
+ User-friendly description of the "GUI mobs follow cursor" property.
+
+
+
+
+ "General numeric goal" edit screen
+
+ GUI Screen whose job is to provide an interface for editing general numeric goals.
+
+
+
+
betterstats.gui.screen.edit_siv_goal.stat_type
+ Label that indicates to the user that the text field below it is for defining the "stat type" of the goal.
+
+
+
+
+
betterstats.gui.screen.edit_siv_goal.stat_subject
+ Label that indicates to the user that the text field below it is for defining the "stat subject" of the goal.
+
+
+
+
+
betterstats.gui.screen.edit_siv_goal.target_value_range
+ Label that indicates to the user that the text fields below it are for defining the "target value range" of the goal.
+
+
+
+
+ Menubar
+
+ The GUI menubar panel that appears at the top of the better "Statistics" screen.
+
+
+
+
betterstats.gui.menubar.file
+
File menubar item.
+
+
+
+
+
betterstats.gui.menubar.file.new
+
File > New menubar item.
+
+
+
+
+
betterstats.gui.menubar.file.open
+
File > Open menubar item.
+
+
+
+
+
betterstats.gui.menubar.file.save_as
+
File > Save as menubar item.
+
+
+
+
+
betterstats.gui.menubar.file.settings
+
File > Settings menubar item.
+
+
+
+
+
betterstats.gui.menubar.file.close
+
File > Close menubar item.
+
+
+
+
+
betterstats.gui.menubar.view
+
View menubar item.
+
+
+
+
+
betterstats.gui.menubar.view.vanilla_screen
+
View > Vanilla screen menubar item.
+
+
+
+
+
betterstats.gui.menubar.view.homepage
+
View > Home menubar item.
+
+
+
+
+
betterstats.gui.menubar.view.local_player_stats
+
View > My statistics menubar item.
+
+
+
+
+
betterstats.gui.menubar.view.stats_view
+
View > Switch view menubar item.
+
+
+
+
+
betterstats.gui.menubar.about
+
About menubar item.
+
+
+
+
+
betterstats.gui.menubar.about.source_code
+
About > Source code menubar item.
+
+
+
+
+
betterstats.gui.menubar.about.support_me
+
About > Support me menubar item.
+
+
+
+
+
betterstats.gui.menubar.about.legal_notices
+
About > Legal notices menubar item.
+
+
+
+
+ Stats view
+
+ When looking at statistics, to the left in the "Filters" menu, there is a dropdown called "Stats view" near the top
+ of the "Filters" panel. That dropdown allows users to select what is known as a "stats view". A "stats view" is
+ what determines which statistics are to be shown on screen; be it general or items or blocks or mobs etc.
+ Language texts featured here are related to those "stats views", and each "view" may have its own dedicated texts.
+
+
+
+
betterstats.gui.statsview.filters
+ The "Filters" label shown on the left side where the "Filters" panel is.
+
+
+
+
+
betterstats.gui.statsview.filter.selected_view
+ Tooltip for the dropdown menu that allows users to select the current "stats view".
+
+
+
+
+
betterstats.gui.statsview.filter.search
+ Placeholder text for the text field that is used for searching.
+
+
+
+
+
betterstats.gui.statsview.filter.show_all_stats
+ The filters checkbox whose label says "Show all stats". Ticking this checkbox shows all related
+ statistics regardless of their values.
+
+
+
+
+
betterstats.gui.statsview.filter.hide_completed_goals
+ The filters checkbox whose label says "Hide completed goals". Ticking this checkbox hides all
+ completed goals in the "Goals" stats view.
+
+
+
+
+
betterstats.gui.statsview.filter.sort_by
+ Tooltip text for the "Sort by" filter dropdown.
+
+
+
+
+
betterstats.gui.statsview.filter.group_by
+ Tooltip text for the "Group by" filter dropdown.
+
+
+
+
+
betterstats.gui.statsview.filter.group_by.all
+ "Group by" filter option that groups all statistics in one singular group.
+
+
+
+
+
betterstats.gui.statsview.filter.group_by.mod
+ "Group by" filter option that groups statistics by the mod they originate from.
+
+
+
+
+
betterstats.gui.statsview.filter.group_by.mob_category
+ "Group by" filter option that groups mob statistics based on mob categories.
+
+
+
+
+
betterstats.gui.statsview.filter.group_by.creative_mode_tab
+ "Group by" filter option that groups item statistics based on the tab items appear in - in the creative mode inventory.
+
+
+
+
+
betterstats.gui.statsview.filter.distance_unit
+ Tooltip text for the "Distance unit" filter dropdown.
+
+
+
+
+
betterstats.gui.statsview.filter.time_unit
+ Tooltip text for the "Time unit" filter dropdown.
+
+
+
+
+
betterstats.gui.statsview.stats.no_stats
+ Text that shows up when there are no statistics to show (either because the player doesn't have any or because
+ none match the given filters' criteria).
+
+
+
+
+
betterstats.gui.statsview.stats.no_goals
+ Text that shows up when there are no goals to show (either because the player did not define any or because
+ none match the given filters' criteria).
+
+
+
+
+
betterstats.gui.statsview.stats.ctxmenu.view_error_info
+ Sometimes, errors may occur when rendering specific statistics on screen. In such cases, right-clicking such
+ errored stats may present the user with a choice to "View error info". That choice uses this textual label.
+
+
+
+
+
betterstats.gui.statsview.stats.ctxmenu.view_on_wiki
+ Right-clicking statistics about a given thing may present the user with a choice to visit the Minecraft wiki
+ article about the corresponding thing. That choise uses this textual label.
+
+
+
+
+
betterstats.gui.statsview.stats.ctxmenu.create_goal
+ Right-clicking statistics about a given thing may present the user with a choice to create a "Goal" about
+ said thing.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals
+ Name of the "Goals" stats view, as shown in the "Selected view" filter dropdown.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.alert1.prefix
+ Prefix text for one of the "Goals"-related alerts that show up on screen.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.alert1
+ Text for one of the "Goals"-related alerts that show up on screen.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.alert2.prefix
+ Prefix text for one of the "Goals"-related alerts that show up on screen.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.alert2
+ Text for one of the "Goals"-related alerts that show up on screen.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.overview
+ Name of the "Overview" section that displays things like how many goals the player completed
+ and what their current overall progress is towards completing all goals.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.overview.completed_goals
+ Goals "Overview" section that shows how many goals were completed.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.overview.total_progress
+ Goals overview section that shows the total progress towards completing all goals.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.new_btn
+ Text of the button for creating new goals.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.manage_btn
+ Text of the button for managing existing goals.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.edit_btn
+ Tooltip text of the button for editing a given goal.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.delete_btn
+ Tooltip text of the button for deleting a given goal.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.delete_btn.confirm
+ Text that (was intended to) show up when clicking the button to delete a goal. Its purpose is to prevent
+ accidental goal deletions.
+
+
+
+
+
betterstats.gui.statsview.mcbs_goals.no_edit_gui
+ Placeholder text that appears on screen when clicking to edit a goal but it turns the developer of that 'goal
+ type' did not code in an editing GUI interface for said goal. It is unlikely you will ever encounter this in-game.
+
+
+
+
+ Home tab
+
+ Texts that appear on the introductory "Home" tab that is shown when the user opens the better "Statistics" screen
+ for the first time in a given session.
+
+
+
+
betterstats.gui.home_tab.featured_stats
+ For the section featuring "Featured statistics".
+
+
+
+
+ Credits
+ Texts related to "Credits" that are featured on the "Home" tab.
+
+
+
betterstats.credits
+ Generic "Credits" label. Used to indicate that a section of GUI is for crediting stuff and people.
+
+
+
+
+
betterstats.credits.section.top_sponsors
+ Credits section featuring top sponsors.
+
+
+
+
+
betterstats.credits.section.top_sponsors.summary
+ Description of the credits section featuring top sponsors.
+
+
+
+
+
betterstats.credits.section.recent_sponsors
+ Credits section featuring recent sponsors.
+
+
+
+
+
betterstats.credits.section.recent_sponsors.summary
+ Description of the credits section featuring recent sponsors.
+
+
+
+
+
betterstats.credits.section.recent_sponsors.entry.sponsor
+ "Call to action" button with intent to get people to click on it to sponsor the project.
+
+
+
+
+
betterstats.credits.section.recent_sponsors.entry.sponsor.summary
+ Description of the "call to action" button that intends to get people to sponsor the project.
+
+
+
+
+
betterstats.credits.section.special_thanks
+ Credits section for "Special thanks" that thanks things and people who are special.
+
+
+
+
+
betterstats.credits.section.special_thanks.summary
+ Description of the "Special thanks" credits section.
+
+
+
+
+
betterstats.credits.section.special_thanks.entry.you
+ "Special thanks" entry crediting you! Yes YOU, the one reading this. Thank you!
+
+
+
+
+
betterstats.credits.section.special_thanks.entry.you.summary
+ Description of the "Special thanks" entry that credits you.
+
+
+
+
+
betterstats.credits.section.special_thanks.entry.contributors
+ "Special thanks" entry crediting contributors. Given you are reading this, it is likely you too
+ may end up credited here. Translate this mod for the community, and you too may be credited as
+ a contributor!
+
+
+
+
+
betterstats.credits.section.special_thanks.entry.contributors.summary
+ Description of the "Special thanks" entry that credits contributors.
+
+
+
+
+
betterstats.credits.section.contributors
+ Title of the dedicated "Contributors" credits section that credits those who contributed to this project.
+
+
+
+
+
betterstats.credits.section.contributors.summary
+ Description of the dedicated "Contributors" credits section.
+
+
+
+
+
betterstats.credits.section.contributors.entry.contribute
+ "Call to action" button whose goal is to get people to contribute to this project.
+
+
+
+
+
betterstats.credits.section.contributors.entry.contribute.summary
+ Description of the "call to action" button that seeks to get people to contribute to this project.
+
+
+
+
+
betterstats.credits.section.founder_contributors
+ Title of the dedicated credits section crediting people who contributed to this project prior to
+
v5.X.
+
+
+
+
+
betterstats.credits.section.founder_contributors.summary
+ Description of the "Founder contributors" credits section.
+
+
+
+
+ Goal types
+
+ Much like how statistics have their "types" (ex. "Times used" and "Times mined"), this mod's "Goals" feature
+ also features the ability to have different "types" of "goals". The following language texts are names
+ for each of those "goal types".
+
+
+
+
betterstats.mcbsgoaltype.betterstats.stat_int_value
+ Goal type for "General numeric goal". This type of goal allows the user to choose a target "stat type",
+ "stat subject", and "target numeric value range".
+
+ For example, suppose the user picks the following;
+
+ - Stat type:
minecraft:mined
+ - Stat subject:
minecraft:stone
+ - Target value range:
from 0 to 50
+
+ The resulting "general numeric goal" then becomes: "Mine 50 Stone."
+
+
+
+
+ General numeric goal | Objective texts
+
+ Every possible "general numeric goal" instance has to have a separate text representing its "objective".
+ Examples include "Mine 64 Stone", "Use 12 Apple", "Craft 128 Iron Helmet", etc.
+
+ This is where complexity explodes, as it is in theory possible to have a unique objective text for every
+ exiting thing in the game; every item, every block, every mob, etc, 10s to 100s of thousands of theoretically
+ possible translation keys, if not millions. For obvious reasons, we do not actually do that. Instead, we define
+ general texts that encompass all possible stat type/subject pairs.
+
+ For example if we take minecraft:mined, instead of creating a translation for each possible block
+ in the game, we create one single translation that goes "Mine %4$d %2$s", capturing all block possibilities in
+ one go. But you are more than welcome to make translations for specific stat type/subject pairs as well.
+
+
+
+ Given the complexity of texts for general numeric goal objectives, this section shall serve as tutorial on how
+ to construct your own custom translation texts for given stat type/subject pairs.
+
+
+ Before we begin, you must first be familiar with identifiers.
+ Identifiers allow the game to keep track of features present in the game by assigning each feature a unique "ID".
+ An identifier consists of a "namespace" and a "path", and an example of an identifier is minecraft:stone where
+ minecraft is the namespace and stone is the path. So remember; namespace:path. That's
+ all an identifier is. So when this tutorial mentions a "namespace", it's referring to the left side of the colon character (:),
+ and "path" refers to the right side of the colon (:).
+
+
+ Next up, examples of stat type identifiers include minecraft:used and minecraft:mined, and examples
+ of stat subject identifiers include minecraft:stone (for a block) and minecraft:apple (for an item).
+ Pairing the two of them like [minecraft:used / minecraft:apple] gets us "How many apples have we used?".
+
+
+
+ When translating an objective, there are 4 formatting arguments you can use:
+
+ %1$s - Stat type name. Ex. "Times used", "Times mined", etc.
+ %2$s - Stat subject name. Ex. "Stone", "Apple", "Iron Helmet", etc.
+ -
+
%3$d - Target range value: to. When creating a goal, user has to define a
+ target "from / to" range. This is the to value. This argument is largely unused.
+
+ -
+
%4$d - Target range value: to - from. When creating a goal, user has to define a
+ target "from / to" range. This is the to - from value. Use this most of the time.
+
+
+ So let's try making an example text with this. How about "100 %1$s for %2$s.". If stat type were
+ "Times mined" and stat subject were "Stone", then this would become "100 Times mined for Stone", which
+ is a 'botched' way of saying "Mine 100 Stone".
+
+
+
+ Depending on the level of complexity you desire, you may pick one of the following formats to translate goal objectives:
+
+ - betterstats.mcbsgoal.siv_objective
+ - betterstats.mcbsgoal.siv_objective.[stat-type namespace].[stat-type path]
+ - betterstats.mcbsgoal.siv_objective.[stat-type namespace].[stat-type path].[stat-subject namespace].[stat-subject path]
+
+ ...where...
+
+ - Stat type namespace - Identifier namespace for the stat type.
+ - Stat type path - Identifier path for the stat type.
+ - Stat subject namespace - Identifier namespace for the stat subject.
+ - Stat subject path - Identifier path for the stat subject.
+
+ This gives you granular control over whether you wish to translate for a specific stat type/subject pair or for all
+ stat subjects in a given stat type or for all objectives overall.
+
+
+
+ Let's begin our practice with the following template:
+ betterstats.mcbsgoal.siv_objective.[stat-type namespace].[stat-type path].[stat-subject namespace].[stat-subject path]
+ We will translate an example stat type/subject pair. How about... [minecraft:used / minecraft:apple].
+ That would then become; "betterstats.mcbsgoal.siv_objective.minecraft.used.minecraft.apple": "Use %4$d apples".
+
+ But of-course, we do not wish to translate for every single item that could ever exist. That'd be insane. This is where the next
+ template comes in:
+ betterstats.mcbsgoal.siv_objective.[stat-type namespace].[stat-type path]
+ This one encompasses all possible stat subjects for a given stat type. Let's give it a shot and see what it'd look like:
+ "betterstats.mcbsgoal.siv_objective.minecraft.used": "Use %4$d %2$s"
+ This then becomes something like "Use 64 [insert stat subject here]", which is miles better!
+
+ And lastly, what if we do not wish to translate for any stat subjects or stat types? This is where our last fallback template comes in:
+ betterstats.mcbsgoal.siv_objective
+ In practice, it usually looks something like this:
+ "betterstats.mcbsgoal.siv_objective": "%4$d [%1$s] for [%2$s]"
+ ...and an in-game text for this may look like "64 [Times mined] for [Stone]". As you can see, this fallback template
+ includes both the stat type name and the stat subject name simultaneously, which does end up looking a little weird/botched, but
+ it also gets the job done.
+
+
+
+
+
+
betterstats.mcbsgoal.siv_objective
+ Fallback objective text that encompasses all possible stat type/subject combinations.
+
+
+
+
+
betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal
+ Placeholder stat type/subject pair used to tell the user that a goal was just created and needs be
+ configured/edited.
+
+
+
+
+
betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal
+ Placeholder stat type/subject pair used to tell the user that a goal was just created and needs be
+ configured/edited.
+
+
+
+
+ And for the rest of 'general numeric goal' related texts, consult the tutorial above.
+
+
+
+
diff --git a/src/main/resources/assets/betterstats/lang/en_us.json b/src/main/resources/assets/betterstats/lang/en_us.json
index c862f7c..e637741 100644
--- a/src/main/resources/assets/betterstats/lang/en_us.json
+++ b/src/main/resources/assets/betterstats/lang/en_us.json
@@ -54,7 +54,7 @@
"betterstats.gui.statsview.filter.selected_view": "Selected view",
"betterstats.gui.statsview.filter.search": "Search",
"betterstats.gui.statsview.filter.show_all_stats": "Show all stats",
- "betterstats.gui.statsview.filter.hide_completed_goals": "Hide completed hoals",
+ "betterstats.gui.statsview.filter.hide_completed_goals": "Hide completed goals",
"betterstats.gui.statsview.filter.sort_by": "Sort by",
"betterstats.gui.statsview.filter.group_by": "Group by",
"betterstats.gui.statsview.filter.group_by.all": "All",
@@ -67,6 +67,7 @@
"betterstats.gui.statsview.stats.no_goals": "There are no goals to show yet...",
"betterstats.gui.statsview.stats.ctxmenu.view_error_info": "View error info",
"betterstats.gui.statsview.stats.ctxmenu.view_on_wiki": "View on Wiki",
+ "betterstats.gui.statsview.stats.ctxmenu.create_goal": "Create goal",
"betterstats.gui.statsview.mcbs_goals": "Goals",
"betterstats.gui.statsview.mcbs_goals.alert1.prefix": "[New ✨]",
"betterstats.gui.statsview.mcbs_goals.alert1": "Define custom milestones to track your progress toward specific statistical targets like resource collection.",
@@ -108,7 +109,7 @@
"betterstats.mcbsgoal.siv_objective": "%4$d [%1$s] for [%2$s]",
"betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal": "Edit this goal",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom": "Do '%2$s' %4$d times",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom": "Do [%2$s] %4$d times",
"betterstats.mcbsgoal.siv_objective.minecraft.broken": "Break %4$d %2$s",
"betterstats.mcbsgoal.siv_objective.minecraft.crafted": "Craft %4$d %2$s",
"betterstats.mcbsgoal.siv_objective.minecraft.dropped": "Drop %4$d %2$s",
@@ -127,7 +128,7 @@
"betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm": "Climb %4$d cm",
"betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm": "Crouch %4$d cm",
"betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed": "Absorb %4$d damage",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "Block %4$d damage",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "Block %4$d damage using a shield",
"betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt": "Deal %4$d damage",
"betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed": "Deal %4$d damage (Absorbed)",
"betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted": "Deal %4$d damage (Resisted)",
diff --git a/src/main/resources/assets/betterstats/lang/pl_pl.json b/src/main/resources/assets/betterstats/lang/pl_pl.json
new file mode 100644
index 0000000..824018e
--- /dev/null
+++ b/src/main/resources/assets/betterstats/lang/pl_pl.json
@@ -0,0 +1,198 @@
+{
+ "modmenu.nameTranslation.betterstats": "Better Statistics Screen",
+ "modmenu.summaryTranslation.betterstats": "Mod do Minecraft poprawiający ekran statystyki czyniąc go bardziej użytecznym.",
+
+ "mobCategory.monster": "Potwory",
+ "mobCategory.creature": "Stworzenia",
+ "mobCategory.ambient": "Ambient",
+ "mobCategory.axolotls": "Aksolotle",
+ "mobCategory.underground_water_creature": "Podziemne stworzenia wodne",
+ "mobCategory.water_creature": "Stworzenia wodne",
+ "mobCategory.water_ambient": "Wodne ambient",
+ "mobCategory.misc": "Różnorodne",
+
+ "stat.blocksButton": "Bloki",
+ "stat.betterstats.time_since_login": "Czas w tej sesji",
+
+ "commands.statistics.edit.output": "Edytowano statystykę %s dla %d Gracza/y.",
+ "commands.statistics.clear.output": "Wyczyszczono statystyki %d Gracza/y.",
+ "commands.statistics.clear.kick": "Twoje statystyki zostały wyczyszczone, co wymaga od ciebię rozłączen8ia i ponownego połączenia.",
+ "commands.statistics.query.output": "Wartość statystyki %2&s gracza %1&s wynosi %d.",
+
+ "betterstats.config.common.register_commands": "Registruj komendy",
+ "betterstats.config.common.register_commands.tooltip": "Registruje komendy tego moda (n.p. '/statistics').",
+ "betterstats.config.common.api_endpoint": "Punkt Końcowy API",
+ "betterstats.config.common.api_endpoint.tooltip": "Adres URI punktu końcowego interfejsu API REST, którego ten mod używa do komunikacji z serwerami autora moda.",
+ "betterstats.config.common.experimental_features": "Funkcje eksperymentalne",
+ "betterstats.config.common.experimental_features.tooltip": "Określa czy funkcje eksperymentalne mają być włączone.\nTego typu funkcje mogą być niestabilne, powodować awarie, bądź prowadzić do utraty danych. Włącz na własne ryzyko, po czym uruchom ponownie grę.\n\nObecność tych funkcji nie oznacza, że zostaną one ostatecznie wydane. Mogą zostać usunięte w dowolnym momencie bez ostrzeżenia.",
+ "betterstats.config.client.allow_chat_psa": "Zezwalaj na komunikaty informacyjne na czacie",
+ "betterstats.config.client.allow_chat_psa.tooltip": "Pozwala rzadkim wiadomościom informacyjnym od dewelopera tego moda na pojawianie się na czacie. Wyłącz to ustawienie, aby ukryć wszystkie takie powiadomienia.",
+ "betterstats.config.client.gui_mobs_follow_cursor": "Moby w Interfejsie Graficznym Użytkownika podążają za kursorem",
+ "betterstats.config.client.gui_mobs_follow_cursor.tooltip": "Moby w Interfejsie Graficznym Użytkownika wizualnie podążają za pozycją kursora.",
+
+ "betterstats.gui.screen.edit_siv_goal.stat_type": "Typ statystyki (Działanie)",
+ "betterstats.gui.screen.edit_siv_goal.stat_subject": "Przedmiot statystyki (Przedmiot/Byt/Itp.)",
+ "betterstats.gui.screen.edit_siv_goal.target_value_range": "Zakres wartości docelowej",
+
+ "betterstats.gui.menubar.file": "Plik",
+ "betterstats.gui.menubar.file.new": "Nowy",
+ "betterstats.gui.menubar.file.open": "Otwórz",
+ "betterstats.gui.menubar.file.save_as": "Zapisz jako",
+ "betterstats.gui.menubar.file.settings": "Ustawienia",
+ "betterstats.gui.menubar.file.close": "Zamknij",
+ "betterstats.gui.menubar.view": "Widok",
+ "betterstats.gui.menubar.view.vanilla_screen": "Ekran Vanilla",
+ "betterstats.gui.menubar.view.homepage": "Strona Główna",
+ "betterstats.gui.menubar.view.local_player_stats": "Moje statystyki",
+ "betterstats.gui.menubar.view.stats_view": "Zmień widok",
+ "betterstats.gui.menubar.about": "Informacje",
+ "betterstats.gui.menubar.about.source_code": "Kod źródłowy",
+ "betterstats.gui.menubar.about.support_me": "Wesprzyj mnie",
+ "betterstats.gui.menubar.about.legal_notices": "Informacje prawne",
+
+ "betterstats.gui.statsview.filters": "Filtry",
+ "betterstats.gui.statsview.filter.selected_view": "Wybrany widok",
+ "betterstats.gui.statsview.filter.search": "Wyszukaj",
+ "betterstats.gui.statsview.filter.show_all_stats": "Pokaż wszystkie statystyki",
+ "betterstats.gui.statsview.filter.hide_completed_goals": "Ukryj zakończone cele",
+ "betterstats.gui.statsview.filter.sort_by": "Sortuj według",
+ "betterstats.gui.statsview.filter.group_by": "Grupuj według",
+ "betterstats.gui.statsview.filter.group_by.all": "Wszystkie",
+ "betterstats.gui.statsview.filter.group_by.mod": "Nazwa moda",
+ "betterstats.gui.statsview.filter.group_by.mob_category": "Kategorie mobów",
+ "betterstats.gui.statsview.filter.group_by.creative_mode_tab": "Grupa przedmiotu",
+ "betterstats.gui.statsview.filter.distance_unit": "Jednostka dystansu",
+ "betterstats.gui.statsview.filter.time_unit": "Jednostka czasu",
+ "betterstats.gui.statsview.stats.no_stats": "Nie ma jeszcze statystyk do pokazania...",
+ "betterstats.gui.statsview.stats.no_goals": "Nie ma jeszcze celi do pokazania...",
+ "betterstats.gui.statsview.stats.ctxmenu.view_error_info": "Wyświetl Informacje o błędzie",
+ "betterstats.gui.statsview.stats.ctxmenu.view_on_wiki": "Wyświetl w Wiki",
+ "betterstats.gui.statsview.stats.ctxmenu.create_goal": "Utwórz cel",
+ "betterstats.gui.statsview.mcbs_goals": "Cele",
+ "betterstats.gui.statsview.mcbs_goals.alert1.prefix": "[Nowy ✨]",
+ "betterstats.gui.statsview.mcbs_goals.alert1": "Określ własne kamienie milowe, aby śledzić postępy w specyficznych celów statystycznych takich jak zbieranie zasobów.",
+ "betterstats.gui.statsview.mcbs_goals.alert2.prefix": "[Uwaga 💾]",
+ "betterstats.gui.statsview.mcbs_goals.alert2": "Te cele nie są zachowywane po ponownym dołączeniu do gry ani po ponownym uruchomieniu gry. Ta brakująca funkcja może zostać dodana w przyszłości.",
+ "betterstats.gui.statsview.mcbs_goals.overview": "Przegląd",
+ "betterstats.gui.statsview.mcbs_goals.overview.completed_goals": "Zakończone cele",
+ "betterstats.gui.statsview.mcbs_goals.overview.total_progress": "Całkowity progres",
+ "betterstats.gui.statsview.mcbs_goals.new_btn": "[ + Nowy cel ]",
+ "betterstats.gui.statsview.mcbs_goals.manage_btn": "Zarządzaj celami",
+ "betterstats.gui.statsview.mcbs_goals.edit_btn": "Edytuj cel",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn": "Usuń cel",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn.confirm": "Jesteś pewien?",
+ "betterstats.gui.statsview.mcbs_goals.no_edit_gui": "Ten typ celu nie ma interfejsu do edytowania.",
+
+ "betterstats.gui.home_tab.featured_stats": "Wyróżnione statystyki",
+
+ "betterstats.credits": "Twórcy",
+ "betterstats.credits.section.top_sponsors": "Najwięksi sponsorzy",
+ "betterstats.credits.section.top_sponsors.summary": "Największe wsparcie finansowe dla tego projektu.",
+ "betterstats.credits.section.recent_sponsors": "Ostatni sponsorzy",
+ "betterstats.credits.section.recent_sponsors.summary": "Najnowsze wsparcie finansowe dla tego projektu",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor": "[+] [Sponsoruj]",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor.summary": "Wesprzyj tego moda i jego postęp poprzez zostanie sponsorem.",
+ "betterstats.credits.section.special_thanks": "Specjalne podzienkowania",
+ "betterstats.credits.section.special_thanks.summary": "Specjalne podziękowania dla tych którzy umożliwili powstanie tego moda.",
+ "betterstats.credits.section.special_thanks.entry.you": "[Ty]",
+ "betterstats.credits.section.special_thanks.entry.you.summary": "Specjalne podziękowania dla CIEBIĘ, za twoje wsparcie i za pomoc w utrzymaniu tego moda przy życiu.",
+ "betterstats.credits.section.special_thanks.entry.contributors": "[Współtwórcy]",
+ "betterstats.credits.section.special_thanks.entry.contributors.summary": "Członkowie społeczności którzy przyczynili się do rozwoju tego moda, zgłaszali błędy, i przekazywali opinie. Wasza pomoc wiele znaczy.",
+ "betterstats.credits.section.contributors": "Współtwórcy",
+ "betterstats.credits.section.contributors.summary": "Człąkowie społeczności którzy przyczynili się do rozwoju tego moda w wersji v5.X.",
+ "betterstats.credits.section.contributors.entry.contribute": "[+] [Przyczyń się]",
+ "betterstats.credits.section.contributors.entry.contribute.summary": "Przyczyń się do rozwoju tego moda aby znaleść się na tej liście.",
+ "betterstats.credits.section.founder_contributors": "Pierwsi współtwórcy",
+ "betterstats.credits.section.founder_contributors.summary": "Człąkowie społezcności, którzy przyczynili się do rozwoju tego moda przed wersją v5.X.",
+
+ "betterstats.mcbsgoaltype.betterstats.stat_int_value": "Ogólne cele numeryczne",
+
+ "betterstats.mcbsgoal.siv_objective": "%4$d [%1$s] dla [%2$s]",
+ "betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal": "Edytuj ten cel",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom": "Zrób [%2$s] %4$d razy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.broken": "Zepsuj %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.crafted": "Stwórz %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.dropped": "Upuść %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.mined": "Zniszcz %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.picked_up": "Podnieś %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.used": "Użyj %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed": "Zabij %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed_by": "Umrzyj od %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.animals_bred": "Rozmnażaj zwierzęta: %4$d",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.aviate_one_cm": "Przeleć %4$d cm za pomocą elytry",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.bell_ring": "Zadzwoń %4$d raz/y dzwonem",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.boat_one_cm": "Przepłyń łodzią %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_armor": "Wyczyść %4$d elementów zbroi",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_banner": "Wyczyść %4$d sztandarów",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_shulker_box": "wyczyść %4$d skrzynek shulkerowych",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm": "Wspinaj się przez %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm": "Przejdź %4$d cm po kucaku",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed": "Pochłoń %4$d obrażeń",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "Zablokuj %4$d obrażeń przy użyciu tarczy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt": "Zadaj %4$d obrażeń",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed": "Zadaj %4$d obrażeń (pochłoniętych)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted": "Zadaj %4$d obrażeń (odpartych)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_resisted": "Odeprzyj %4$d obrażeń",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_taken": "Otrzymaj %4$d obrażeń",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.deaths": "Umrzyj %4$d razy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.drop": "Upuść %4$d przedmioty",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.eat_cake_slice": "Zjedz %4$d kawałków ciasta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.enchant_item": "Zaklnij %4$d przedmioty",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fall_one_cm": "Spadnij przez %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fill_cauldron": "Napełnij %4$d kotłów",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fish_caught": "Wyłów %4$d ryby",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fly_one_cm": "Leć przez %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.happy_ghast_one_cm": "Leć przez %4$d cm za pomocą wesołego ghasta",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.horse_one_cm": "Przejedź przez %4$d cm na koniu",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dispenser": "Przeszukaj %4$d dozowników",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dropper": "Przeszukaj %4$d podajników",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_hopper": "Przeszukaj %4$d leji",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_anvil": "Wejdź w interakcje z %4$d kowadłami",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_beacon": "Wejdź w interakcje z %4$d magicznymi latarniami",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_blast_furnace": "Wejdź w interakcje z %4$d piecem hutniczym",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_brewingstand": "Wejdź w interakcje z %4$d statywem alchemicznym",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_campfire": "Wejdź w interakcje z %4$d ogniskami",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_cartography_table": "Wejdź w interakcje ze %4$d stołami kartograficznymi",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_crafting_table": "Wejdź w interakcje ze %4$d stołami rzemiellśniczymi",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_furnace": "Wejdź w interakcje z %4$d piecami",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_grindstone": "Wejdź w interakcje z %4$d kamieniem szliferskim",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_lectern": "Wejdź w interakcje z %4$d pulpitami",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_loom": "Wejdź w interakcje z %4$d krosnami",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smithing_table": "Wejdź w interakcje ze %4$d stołami kowalskimi",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smoker": "Wejdź w interakcje z %4$d wędzarką",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_stonecutter": "Wejdź w interakcje z %4$d przecinarkami",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.jump": "Skocz %4$d razy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.leave_game": "Wyjdź z gry %4$d razy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.minecart_one_cm": "Przejedź %4$d cm za pomocą wagonika",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.mob_kills": "Zabij %4$d mobów",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.nautilus_one_cm": "Przepłyń %4$d cm za pomocą Łodzika",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_barrel": "Otwórz %4$d beczek",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_chest": "Otwórz %4$d skrzyni",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_enderchest": "Otwórz %4$d skrzyni enderu",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_shulker_box": "Otwórz %4$d skrzyni shulkerowych",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pig_one_cm": "Przejdź %4$d cm za pomocą świni",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_noteblock": "Zagraj %4$d bloków dźwiękowych",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_record": "Zagraj %4$d Płyt z muzyka",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_time": "Graj przez %4$d tików",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.player_kills": "Zabij %4$d Graczy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pot_flower": "Posadź %4$d roślin w doniczkach",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_trigger": "Wywołaj %4$d rajdy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_win": "Wygraj %4$d rajdy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sleep_in_bed": "Śpij w %4$d łóżkach",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sneak_time": "Kucaj przez %4$d tików",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sprint_one_cm": "Przebiegnij %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.strider_one_cm": "Przejdź %4$d cm za pomocą magmołaza",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.swim_one_cm": "Przepłyń %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.talked_to_villager": "Zagadaj %4$d razy z osadnikiem",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.target_hit": "Ustrzel %4$d tarcz strzeleckich",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_death": "Nie umieraj przez %4$d tików",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_rest": "Nie śpij przez %4$d tików",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.total_world_time": "Graj przez %4$d tików",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.traded_with_villager": "Zahandluj %4$d razy z Osadnikiem",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.trigger_trapped_chest": "Aktywój %4$d skrzyń pułapek",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.tune_noteblock": "Dostrój %4$d bloków dźwiękowych",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.use_cauldron": "Użyj kotłów %4$d razy",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_on_water_one_cm": "Przejdź %4$d cm po wodzie",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_one_cm": "Przejdź %4$d cm",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_under_water_one_cm": "Przejdź %4$d cm pod wodą"
+}
diff --git a/src/main/resources/assets/betterstats/lang/ru_ru.json b/src/main/resources/assets/betterstats/lang/ru_ru.json
new file mode 100644
index 0000000..64745b9
--- /dev/null
+++ b/src/main/resources/assets/betterstats/lang/ru_ru.json
@@ -0,0 +1,198 @@
+{
+ "modmenu.nameTranslation.betterstats" : "Better Statistics Screen",
+ "modmenu.summaryTranslation.betterstats" : "Мод для Minecraft, который улучшает экран статистики и делает его более полезным.",
+
+ "mobCategory.monster" : "Монстры",
+ "mobCategory.creature" : "Существа",
+ "mobCategory.ambient" : "Окружающие сущности",
+ "mobCategory.axolotls" : "Аксолотли",
+ "mobCategory.underground_water_creature" : "Подземные водные существа",
+ "mobCategory.water_creature" : "Водные существа",
+ "mobCategory.water_ambient" : "Водные окружающие сущности",
+ "mobCategory.misc" : "Прочее",
+
+ "stat.blocksButton" : "Блоки",
+ "stat.betterstats.time_since_login" : "Время этой сессии",
+
+ "commands.statistics.edit.output" : "Отредактирована статистика %s для %d игрока(ов).",
+ "commands.statistics.clear.output" : "Статистика очищена для %d игрока(ов).",
+ "commands.statistics.clear.kick" : "Ваша статистика была очищена, для применения изменений необходимо переподключиться к серверу.",
+ "commands.statistics.query.output" : "Значение статистики %s для %s составляет %d.",
+
+ "betterstats.config.common.register_commands" : "Регистрация команд",
+ "betterstats.config.common.register_commands.tooltip" : "Регистрирует команды мода (например, '/statistics').",
+ "betterstats.config.common.api_endpoint" : "Конечная точка API",
+ "betterstats.config.common.api_endpoint.tooltip" : "URI-адрес конечной точки REST-ful HTTP API, используемый модом для связи с серверами разработчика.",
+ "betterstats.config.common.experimental_features" : "Экспериментальные функции",
+ "betterstats.config.common.experimental_features.tooltip" : "Включение экспериментальных функций.\nТакие функции могут работать нестабильно, приводить к сбоям или потере данных. Вы активируете их на свой страх и риск, после чего необходимо перезапустить игру.\n\nНаличие подобных функций не гарантирует их появление в финальной версии. Они могут быть удалены в любой момент без предупреждения.",
+ "betterstats.config.client.allow_chat_psa" : "Разрешить служебные сообщения в чате",
+ "betterstats.config.client.allow_chat_psa.tooltip" : "Разрешает редкие информационные сообщения от разработчика мода в чате. Отключите для подавления всех подобных уведомлений.",
+ "betterstats.config.client.gui_mobs_follow_cursor" : "Мобы в интерфейсе следят за курсором",
+ "betterstats.config.client.gui_mobs_follow_cursor.tooltip" : "Мобы в графическом интерфейсе статистики визуально следят за положением курсора.",
+
+ "betterstats.gui.screen.edit_siv_goal.stat_type" : "Тип статистики (Действие)",
+ "betterstats.gui.screen.edit_siv_goal.stat_subject" : "Предмет статистики (Предмет/Сущность и др.)",
+ "betterstats.gui.screen.edit_siv_goal.target_value_range" : "Диапазон целевого значения",
+
+ "betterstats.gui.menubar.file" : "Файл",
+ "betterstats.gui.menubar.file.new" : "Новый",
+ "betterstats.gui.menubar.file.open" : "Открыть",
+ "betterstats.gui.menubar.file.save_as" : "Сохранить как",
+ "betterstats.gui.menubar.file.settings" : "Настройки",
+ "betterstats.gui.menubar.file.close" : "Закрыть",
+ "betterstats.gui.menubar.view" : "Вид",
+ "betterstats.gui.menubar.view.vanilla_screen" : "Ванильный экран",
+ "betterstats.gui.menubar.view.homepage" : "Главная",
+ "betterstats.gui.menubar.view.local_player_stats" : "Моя статистика",
+ "betterstats.gui.menubar.view.stats_view" : "Переключить вид",
+ "betterstats.gui.menubar.about" : "О моде",
+ "betterstats.gui.menubar.about.source_code" : "Исходный код",
+ "betterstats.gui.menubar.about.support_me" : "Поддержать автора",
+ "betterstats.gui.menubar.about.legal_notices" : "Юридическая информация",
+
+ "betterstats.gui.statsview.filters" : "Фильтры",
+ "betterstats.gui.statsview.filter.selected_view" : "Выбранный вид",
+ "betterstats.gui.statsview.filter.search" : "Поиск",
+ "betterstats.gui.statsview.filter.show_all_stats" : "Показать всю статистику",
+ "betterstats.gui.statsview.filter.hide_completed_goals" : "Скрыть выполненные цели",
+ "betterstats.gui.statsview.filter.sort_by" : "Сортировать по",
+ "betterstats.gui.statsview.filter.group_by" : "Группировать по",
+ "betterstats.gui.statsview.filter.group_by.all" : "Всё",
+ "betterstats.gui.statsview.filter.group_by.mod" : "Название мода",
+ "betterstats.gui.statsview.filter.group_by.mob_category" : "Категория моба",
+ "betterstats.gui.statsview.filter.group_by.creative_mode_tab" : "Группа предметов",
+ "betterstats.gui.statsview.filter.distance_unit" : "Единица расстояния",
+ "betterstats.gui.statsview.filter.time_unit" : "Единица времени",
+ "betterstats.gui.statsview.stats.no_stats" : "Статистика пока отсутствует...",
+ "betterstats.gui.statsview.stats.no_goals" : "Цели пока отсутствуют...",
+ "betterstats.gui.statsview.stats.ctxmenu.view_error_info" : "Просмотр информации об ошибке",
+ "betterstats.gui.statsview.stats.ctxmenu.view_on_wiki" : "Просмотр на Wiki",
+ "betterstats.gui.statsview.stats.ctxmenu.create_goal" : "Создать цель",
+ "betterstats.gui.statsview.mcbs_goals" : "Цели",
+ "betterstats.gui.statsview.mcbs_goals.alert1.prefix" : "[Новое ✨]",
+ "betterstats.gui.statsview.mcbs_goals.alert1" : "Создавайте пользовательские этапы для отслеживания прогресса достижения конкретных целей статистики, таких как сбор ресурсов.",
+ "betterstats.gui.statsview.mcbs_goals.alert2.prefix" : "[Примечание 💾]",
+ "betterstats.gui.statsview.mcbs_goals.alert2" : "Эти цели не сохраняются после переподключения и перезапуска игры. Эта функция, возможно, будет реализована в будущем.",
+ "betterstats.gui.statsview.mcbs_goals.overview" : "Обзор",
+ "betterstats.gui.statsview.mcbs_goals.overview.completed_goals" : "Выполненные цели",
+ "betterstats.gui.statsview.mcbs_goals.overview.total_progress" : "Общий прогресс",
+ "betterstats.gui.statsview.mcbs_goals.new_btn" : "[ + Новая цель ]",
+ "betterstats.gui.statsview.mcbs_goals.manage_btn" : "Управление целями",
+ "betterstats.gui.statsview.mcbs_goals.edit_btn" : "Редактировать цель",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn" : "Удалить цель",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn.confirm" : "Вы уверены?",
+ "betterstats.gui.statsview.mcbs_goals.no_edit_gui" : "У данного типа цели нет интерфейса редактирования.",
+
+ "betterstats.gui.home_tab.featured_stats" : "Основные статистические данные",
+
+ "betterstats.credits" : "Авторы",
+ "betterstats.credits.section.top_sponsors" : "Главные спонсоры",
+ "betterstats.credits.section.top_sponsors.summary" : "Основные финансовые вложения в проект.",
+ "betterstats.credits.section.recent_sponsors" : "Последние спонсоры",
+ "betterstats.credits.section.recent_sponsors.summary" : "Недавние финансовые вложения в проект.",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor" : "[+] [Спонсор]",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor.summary" : "Внесите вклад в развитие этого мода, став спонсором.",
+ "betterstats.credits.section.special_thanks" : "Особая благодарность",
+ "betterstats.credits.section.special_thanks.summary" : "Благодарности тем, кто сделал этот мод возможным.",
+ "betterstats.credits.section.special_thanks.entry.you" : "[Вы]",
+ "betterstats.credits.section.special_thanks.entry.you.summary" : "Особая благодарность ВАМ за поддержку и помощь в развитии мода.",
+ "betterstats.credits.section.special_thanks.entry.contributors" : "[Участники]",
+ "betterstats.credits.section.special_thanks.entry.contributors.summary" : "Все, кто помогал с модом, сообщал об ошибках и оставлял отзывы. Ваша помощь неоценима.",
+ "betterstats.credits.section.contributors" : "Участники разработки",
+ "betterstats.credits.section.contributors.summary" : "Члены сообщества, внесшие свой вклад в этот мод в версии v5.X.",
+ "betterstats.credits.section.contributors.entry.contribute" : "[+] [Участвовать]",
+ "betterstats.credits.section.contributors.entry.contribute.summary" : "Внесите вклад в разработку мода, чтобы попасть в этот список.",
+ "betterstats.credits.section.founder_contributors" : "Основатели-участники",
+ "betterstats.credits.section.founder_contributors.summary" : "Члены сообщества, внесшие свой вклад в мод до версии v5.X.",
+
+ "betterstats.mcbsgoaltype.betterstats.stat_int_value" : "Общая числовая цель",
+
+ "betterstats.mcbsgoal.siv_objective" : "%4$d [%1$s] для [%2$s]",
+ "betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal" : "Редактировать эту цель",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom" : "Выполнить [%2$s] %4$d раз(а)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.broken" : "Сломать %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.crafted" : "Создать %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.dropped" : "Выбросить %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.mined" : "Добыть %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.picked_up" : "Подобрать %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.used" : "Использовать %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed" : "Убить %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed_by" : "Погибнуть от %4$d %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.animals_bred" : "Развести %4$d животных",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.aviate_one_cm" : "Пролететь %4$d см на элитрах",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.bell_ring" : "Позвонить в %4$d колоколов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.boat_one_cm" : "Проплыть на лодке %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_armor" : "Очистить %4$d частей брони",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_banner" : "Очистить %4$d флагов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_shulker_box" : "Очистить %4$d шалкеровых ящиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm" : "Пролезть %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm" : "Прокрасться %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed" : "Поглотить %4$d урона",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield" : "Заблокировать %4$d урона с помощью щита",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt" : "Нанести %4$d урона",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed" : "Нанести %4$d урона (поглощено)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted" : "Нанести %4$d урона (сопротивление)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_resisted" : "Отразить %4$d урона",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_taken" : "Получить %4$d урона",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.deaths" : "Умереть %4$d раз(а)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.drop" : "Выбросить %4$d предметов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.eat_cake_slice" : "Съесть %4$d кусочков торта",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.enchant_item" : "Зачаровать %4$d предметов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fall_one_cm" : "Упасть с высоты %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fill_cauldron" : "Наполнить %4$d котлов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fish_caught" : "Поймать %4$d рыб",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fly_one_cm" : "Пролететь %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.happy_ghast_one_cm" : "Пролететь %4$d см с довольным гастом",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.horse_one_cm" : "Проехать на лошади %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dispenser" : "Изучить %4$d раздатчиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dropper" : "Изучить %4$d выбрасывателей",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_hopper" : "Изучить %4$d воронок",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_anvil" : "Взаимодействовать с %4$d наковальнями",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_beacon" : "Взаимодействовать с %4$d маяками",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_blast_furnace" : "Взаимодействовать с %4$d плавильными печами",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_brewingstand" : "Взаимодействовать с %4$d варочными стойками",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_campfire" : "Взаимодействовать с %4$d кострами",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_cartography_table" : "Взаимодействовать с %4$d столами картографа",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_crafting_table" : "Взаимодействовать с %4$d верстаками",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_furnace" : "Взаимодействовать с %4$d печами",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_grindstone" : "Взаимодействовать с %4$d точилами",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_lectern" : "Взаимодействовать с %4$d кафедрами",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_loom" : "Взаимодействовать с %4$d ткацкими станками",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smithing_table" : "Взаимодействовать с %4$d столами кузнеца",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smoker" : "Взаимодействовать с %4$d коптилками",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_stonecutter" : "Взаимодействовать с %4$d камнерезами",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.jump" : "Прыгнуть %4$d раз(а)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.leave_game" : "Выйти из игры %4$d раз(а)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.minecart_one_cm" : "Проехать на вагонетке %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.mob_kills" : "Убить %4$d мобов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.nautilus_one_cm" : "Проплыть с наутилусом %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_barrel" : "Открыть %4$d бочек",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_chest" : "Открыть %4$d сундуков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_enderchest" : "Открыть %4$d эндер-сундуков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_shulker_box" : "Открыть %4$d шалкеровых ящиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pig_one_cm" : "Проехать на свинье %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_noteblock" : "Включить %4$d нотных блоков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_record" : "Проиграть %4$d пластинок",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_time" : "Играть %4$d тиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.player_kills" : "Убить %4$d игроков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pot_flower" : "Посадить %4$d растений",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_trigger" : "Начать %4$d рейдов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_win" : "Выиграть %4$d рейдов",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sleep_in_bed" : "Поспать в %4$d кроватях",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sneak_time" : "Просидеть в присяди %4$d тиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sprint_one_cm" : "Пробежать %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.strider_one_cm" : "Проехать на страйдере %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.swim_one_cm" : "Проплыть %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.talked_to_villager" : "Поговорить с %4$d жителями",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.target_hit" : "Попасть в %4$d мишеней",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_death" : "Не умирать %4$d тиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_rest" : "Не отдыхать %4$d тиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.total_world_time" : "Играть %4$d тиков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.traded_with_villager" : "Торговать с %4$d жителями",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.trigger_trapped_chest" : "Активировать %4$d сундуков-ловушек",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.tune_noteblock" : "Настроить %4$d нотных блоков",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.use_cauldron" : "Использовать котлы %4$d раз(а)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_on_water_one_cm" : "Пройти %4$d см по воде",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_one_cm" : "Пройти %4$d см",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_under_water_one_cm" : "Пройти %4$d см под водой"
+}
diff --git a/src/main/resources/assets/betterstats/lang/zh_cn.json b/src/main/resources/assets/betterstats/lang/zh_cn.json
index b5b3d12..ec2043d 100644
--- a/src/main/resources/assets/betterstats/lang/zh_cn.json
+++ b/src/main/resources/assets/betterstats/lang/zh_cn.json
@@ -1,6 +1,6 @@
{
"modmenu.nameTranslation.betterstats": "Better Statistics Screen",
- "modmenu.summaryTranslation.betterstats": "A Minecraft mod that improves the statistics screen and makes it more useful.",
+ "modmenu.summaryTranslation.betterstats": "一个改进统计屏幕并使其更有用的 Minecraft 模组。",
"mobCategory.monster": "敌对生物",
"mobCategory.creature": "自然生物",
@@ -12,27 +12,27 @@
"mobCategory.misc": "其他生物",
"stat.blocksButton": "方块",
- "stat.betterstats.time_since_login": "Time this session",
+ "stat.betterstats.time_since_login": "本次会话时间",
"commands.statistics.edit.output": "为 %d 个玩家修改了统计信息 %s。",
"commands.statistics.clear.output": "清除了 %d 个玩家的统计信息。",
- "commands.statistics.clear.kick": "你的统计信息已被清理,请中断连接并重新加入世界。",
+ "commands.statistics.clear.kick": "你的统计信息已被清理,请断开连接并重新加入世界。",
"commands.statistics.query.output": "%s 的统计信息 %s 的值为 %d。",
"betterstats.config.common.register_commands": "注册命令",
"betterstats.config.common.register_commands.tooltip": "注册此模组的命令(例如 '/statistics')。",
"betterstats.config.common.api_endpoint": "API 端点",
"betterstats.config.common.api_endpoint.tooltip": "此模组用于与此模组开发者的服务器通信的 RESTful HTTP API 端点的 URI 地址。",
- "betterstats.config.common.experimental_features": "Experimental features",
- "betterstats.config.common.experimental_features.tooltip": "Whether to enable experimental features.\nSuch features may be buggy, cause crashes, or result in data loss. Enable at your own risk, then restart the game.\n\nPresence of such features is not indicative of their eventual release. They may be removed at any time without warning.",
+ "betterstats.config.common.experimental_features": "实验性功能",
+ "betterstats.config.common.experimental_features.tooltip": "是否启用实验性功能。\n此类功能可能存在漏洞、导致崩溃或数据丢失。请自行承担风险启用,然后重启游戏。\n\n这些功能的存在并不代表它们最终会发布。它们可能随时被移除,恕不另行通知。",
"betterstats.config.client.allow_chat_psa": "允许聊天 PSA 消息",
"betterstats.config.client.allow_chat_psa.tooltip": "允许来自此模组开发者的罕见信息性 PSA 消息显示在聊天栏中。关闭此选项以屏蔽所有此类通知。",
"betterstats.config.client.gui_mobs_follow_cursor": "GUI 生物看向光标",
"betterstats.config.client.gui_mobs_follow_cursor.tooltip": "实体统计信息 GUI 中的生物会始终看向光标位置。",
- "betterstats.gui.screen.edit_siv_goal.stat_type": "Stat type (Activity)",
- "betterstats.gui.screen.edit_siv_goal.stat_subject": "Stat subject (Item/Entity/Etc)",
- "betterstats.gui.screen.edit_siv_goal.target_value_range": "Target value range",
+ "betterstats.gui.screen.edit_siv_goal.stat_type": "统计类型(活动)",
+ "betterstats.gui.screen.edit_siv_goal.stat_subject": "统计主题(物品/实体等)",
+ "betterstats.gui.screen.edit_siv_goal.target_value_range": "目标数值范围",
"betterstats.gui.menubar.file": "文件",
"betterstats.gui.menubar.file.new": "新建",
@@ -54,7 +54,7 @@
"betterstats.gui.statsview.filter.selected_view": "选择的视图",
"betterstats.gui.statsview.filter.search": "搜索",
"betterstats.gui.statsview.filter.show_all_stats": "显示所有统计信息",
- "betterstats.gui.statsview.filter.hide_completed_goals": "Hide completed hoals",
+ "betterstats.gui.statsview.filter.hide_completed_goals": "隐藏已完成的目标",
"betterstats.gui.statsview.filter.sort_by": "排序方式",
"betterstats.gui.statsview.filter.group_by": "分组方式",
"betterstats.gui.statsview.filter.group_by.all": "全部",
@@ -64,33 +64,34 @@
"betterstats.gui.statsview.filter.distance_unit": "距离单位",
"betterstats.gui.statsview.filter.time_unit": "时间单位",
"betterstats.gui.statsview.stats.no_stats": "暂无可显示的统计信息……",
- "betterstats.gui.statsview.stats.no_goals": "There are no goals to show yet...",
- "betterstats.gui.statsview.stats.ctxmenu.view_error_info": "View error info",
+ "betterstats.gui.statsview.stats.no_goals": "暂无可显示的目标……",
+ "betterstats.gui.statsview.stats.ctxmenu.view_error_info": "查看错误信息",
"betterstats.gui.statsview.stats.ctxmenu.view_on_wiki": "在 Wiki 上查看",
- "betterstats.gui.statsview.mcbs_goals": "Goals",
- "betterstats.gui.statsview.mcbs_goals.alert1.prefix": "[New ✨]",
- "betterstats.gui.statsview.mcbs_goals.alert1": "Define custom milestones to track your progress toward specific statistical targets like resource collection.",
- "betterstats.gui.statsview.mcbs_goals.alert2.prefix": "[Note 💾]",
- "betterstats.gui.statsview.mcbs_goals.alert2": "These goals do not persist across rejoins and restarts. This missing feature may be implemented eventually.",
- "betterstats.gui.statsview.mcbs_goals.overview": "Overview",
- "betterstats.gui.statsview.mcbs_goals.overview.completed_goals": "Completed goals",
- "betterstats.gui.statsview.mcbs_goals.overview.total_progress": "Total progress",
- "betterstats.gui.statsview.mcbs_goals.new_btn": "[ + New goal ]",
- "betterstats.gui.statsview.mcbs_goals.manage_btn": "Manage goals",
- "betterstats.gui.statsview.mcbs_goals.edit_btn": "Edit goal",
- "betterstats.gui.statsview.mcbs_goals.delete_btn": "Delete goal",
- "betterstats.gui.statsview.mcbs_goals.delete_btn.confirm": "Are you sure?",
- "betterstats.gui.statsview.mcbs_goals.no_edit_gui": "This goal type does not have an editing interface.",
+ "betterstats.gui.statsview.stats.ctxmenu.create_goal": "创建目标",
+ "betterstats.gui.statsview.mcbs_goals": "目标",
+ "betterstats.gui.statsview.mcbs_goals.alert1.prefix": "[新功能 ✨]",
+ "betterstats.gui.statsview.mcbs_goals.alert1": "定义自定义里程碑,以追踪您在特定统计目标(如资源收集)上的进度。",
+ "betterstats.gui.statsview.mcbs_goals.alert2.prefix": "[注意 💾]",
+ "betterstats.gui.statsview.mcbs_goals.alert2": "这些目标在重新加入或重启后不会保留。此缺失功能可能在将来实现。",
+ "betterstats.gui.statsview.mcbs_goals.overview": "概览",
+ "betterstats.gui.statsview.mcbs_goals.overview.completed_goals": "已完成的目标",
+ "betterstats.gui.statsview.mcbs_goals.overview.total_progress": "总进度",
+ "betterstats.gui.statsview.mcbs_goals.new_btn": "[ + 新建目标 ]",
+ "betterstats.gui.statsview.mcbs_goals.manage_btn": "管理目标",
+ "betterstats.gui.statsview.mcbs_goals.edit_btn": "编辑目标",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn": "删除目标",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn.confirm": "确定要删除吗?",
+ "betterstats.gui.statsview.mcbs_goals.no_edit_gui": "此目标类型没有编辑界面。",
- "betterstats.gui.home_tab.featured_stats": "Featured statistics",
+ "betterstats.gui.home_tab.featured_stats": "精选统计",
"betterstats.credits": "鸣谢",
"betterstats.credits.section.top_sponsors": "顶级赞助者",
"betterstats.credits.section.top_sponsors.summary": "对本项目贡献最大的资金支持者。",
"betterstats.credits.section.recent_sponsors": "近期赞助者",
"betterstats.credits.section.recent_sponsors.summary": "对本项目最近的资金支持者。",
- "betterstats.credits.section.recent_sponsors.entry.sponsor": "[+] [Sponsor]",
- "betterstats.credits.section.recent_sponsors.entry.sponsor.summary": "Contribute to this mod and its development by becoming a sponsor.",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor": "[+] [赞助]",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor.summary": "成为赞助者,为此模组及其开发贡献力量。",
"betterstats.credits.section.special_thanks": "特别鸣谢",
"betterstats.credits.section.special_thanks.summary": "特别鸣谢以及让此模组成为可能的人们。",
"betterstats.credits.section.special_thanks.entry.you": "[您]",
@@ -104,94 +105,94 @@
"betterstats.credits.section.founder_contributors": "创始贡献者",
"betterstats.credits.section.founder_contributors.summary": "在 v5.X 版本之前为此模组做出贡献的社区成员。",
- "betterstats.mcbsgoaltype.betterstats.stat_int_value": "General numeric goal",
+ "betterstats.mcbsgoaltype.betterstats.stat_int_value": "通用数值目标",
- "betterstats.mcbsgoal.siv_objective": "%4$d [%1$s] for [%2$s]",
- "betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal": "Edit this goal",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom": "Do '%2$s' %4$d times",
- "betterstats.mcbsgoal.siv_objective.minecraft.broken": "Break %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.crafted": "Craft %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.dropped": "Drop %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.mined": "Mine %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.picked_up": "Pick up %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.used": "Use %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.killed": "Kill %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.killed_by": "Die to %4$d %2$s",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.animals_bred": "Breed %4$d animals",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.aviate_one_cm": "Fly %4$d cm with elytra",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.bell_ring": "Ring %4$d bells",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.boat_one_cm": "Row a boat for %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_armor": "Clean %4$d armor pieces",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_banner": "Clean %4$d banners",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_shulker_box": "Clean %4$d shulker boxes",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm": "Climb %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm": "Crouch %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed": "Absorb %4$d damage",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "Block %4$d damage",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt": "Deal %4$d damage",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed": "Deal %4$d damage (Absorbed)",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted": "Deal %4$d damage (Resisted)",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_resisted": "Resist %4$d damage",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_taken": "Take %4$d damage",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.deaths": "Die %4$d times",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.drop": "Drop %4$d items",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.eat_cake_slice": "Eat %4$d cake slices",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.enchant_item": "Enchant %4$d items",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fall_one_cm": "Fall %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fill_cauldron": "Fill %4$d cauldrons",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fish_caught": "Catch %4$d fish",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fly_one_cm": "Fly %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.happy_ghast_one_cm": "Fly %4$d cm with happy ghast",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.horse_one_cm": "Travel %4$d cm by horse",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dispenser": "Search %4$d dispensers",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dropper": "Search %4$d droppers",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_hopper": "Search %4$d hoppers",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_anvil": "Interact with %4$d anvils",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_beacon": "Interact with %4$d beacons",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_blast_furnace": "Interact with %4$d blast furnaces",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_brewingstand": "Interact with %4$d brewing stands",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_campfire": "Interact with %4$d campfires",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_cartography_table": "Interact with %4$d cartography tables",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_crafting_table": "Interact with %4$d crafting tables",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_furnace": "Interact with %4$d furnaces",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_grindstone": "Interact with %4$d grindstones",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_lectern": "Interact with %4$d lecterns",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_loom": "Interact with %4$d looms",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smithing_table": "Interact with %4$d smithing tables",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smoker": "Interact with %4$d smokers",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_stonecutter": "Interact with %4$d stonecutters",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.jump": "Jump %4$d times",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.leave_game": "Quit game %4$d times",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.minecart_one_cm": "Travel %4$d cm by minecart",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.mob_kills": "Kill %4$d mobs",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.nautilus_one_cm": "Travel %4$d cm by nautilus",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_barrel": "Open %4$d barrels",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_chest": "Open %4$d chests",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_enderchest": "Open %4$d ender chests",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_shulker_box": "Open %4$d shulker boxes",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pig_one_cm": "Travel %4$d cm by pig",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_noteblock": "Play %4$d note blocks",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_record": "Play %4$d music discs",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_time": "Play for %4$d ticks",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.player_kills": "Kill %4$d players",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pot_flower": "Pot %4$d plants",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_trigger": "Trigger %4$d raids",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_win": "Win %4$d raids",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sleep_in_bed": "Sleep in %4$d beds",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sneak_time": "Sneak for %4$d ticks",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sprint_one_cm": "Sprint %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.strider_one_cm": "Travel %4$d cm by strider",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.swim_one_cm": "Swim %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.talked_to_villager": "Talk to %4$d villagers",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.target_hit": "Hit %4$d targets",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_death": "Don't die for %4$d ticks",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_rest": "Don't rest for %4$d ticks",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.total_world_time": "Play for %4$d ticks",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.traded_with_villager": "Trade with %4$d villagers",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.trigger_trapped_chest": "Trigger %4$d trapped chests",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.tune_noteblock": "Tune %4$d note blocks",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.use_cauldron": "Use cauldrons %4$d times",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_on_water_one_cm": "Walk %4$d cm on water",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_one_cm": "Walk %4$d cm",
- "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_under_water_one_cm": "Walk %4$d cm under water"
-}
+ "betterstats.mcbsgoal.siv_objective": "%2$s 的 %1$s 达到 %4$d",
+ "betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal": "编辑此目标",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom": "执行 %2$s %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.broken": "破坏 %4$d 个 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.crafted": "合成 %4$d 个 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.dropped": "丢弃 %4$d 个 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.mined": "开采 %4$d 个 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.picked_up": "拾取 %4$d 个 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.used": "使用 %4$d 个 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed": "杀死 %4$d 个 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed_by": "被 %2$s 杀死 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.animals_bred": "繁殖 %4$d 只动物",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.aviate_one_cm": "用鞘翅飞行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.bell_ring": "敲响 %4$d 次钟",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.boat_one_cm": "划船行进 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_armor": "清洗 %4$d 件盔甲",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_banner": "清洗 %4$d 面旗帜",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_shulker_box": "清洗 %4$d 个潜影盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm": "攀爬 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm": "潜行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed": "吸收 %4$d 点伤害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "用盾牌格挡 %4$d 点伤害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt": "造成 %4$d 点伤害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed": "造成 %4$d 点伤害(被吸收)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted": "造成 %4$d 点伤害(被抵抗)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_resisted": "抵抗 %4$d 点伤害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_taken": "受到 %4$d 点伤害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.deaths": "死亡 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.drop": "丢弃 %4$d 个物品",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.eat_cake_slice": "吃掉 %4$d 片蛋糕",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.enchant_item": "附魔 %4$d 个物品",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fall_one_cm": "摔落 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fill_cauldron": "填充 %4$d 个炼药锅",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fish_caught": "钓到 %4$d 条鱼",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fly_one_cm": "飞行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.happy_ghast_one_cm": "骑乘开心恶魂飞行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.horse_one_cm": "骑马行进 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dispenser": "查看 %4$d 个发射器",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dropper": "查看 %4$d 个投掷器",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_hopper": "查看 %4$d 个漏斗",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_anvil": "与铁砧交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_beacon": "与信标交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_blast_furnace": "与高炉交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_brewingstand": "与酿造台交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_campfire": "与营火交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_cartography_table": "与制图台交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_crafting_table": "与工作台交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_furnace": "与熔炉交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_grindstone": "与砂轮交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_lectern": "与讲台交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_loom": "与织布机交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smithing_table": "与锻造台交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smoker": "与烟熏炉交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_stonecutter": "与切石机交互 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.jump": "跳跃 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.leave_game": "退出游戏 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.minecart_one_cm": "乘坐矿车行进 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.mob_kills": "杀死 %4$d 只生物",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.nautilus_one_cm": "乘坐鹦鹉螺行进 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_barrel": "打开 %4$d 个木桶",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_chest": "打开 %4$d 个箱子",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_enderchest": "打开 %4$d 个末影箱",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_shulker_box": "打开 %4$d 个潜影盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pig_one_cm": "骑猪行进 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_noteblock": "播放 %4$d 次音符盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_record": "播放 %4$d 张唱片",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_time": "游玩 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.player_kills": "杀死 %4$d 个玩家",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pot_flower": "盆栽 %4$d 株植物",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_trigger": "触发 %4$d 次袭击",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_win": "赢得 %4$d 次袭击",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sleep_in_bed": "睡觉 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sneak_time": "潜行 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sprint_one_cm": "疾跑 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.strider_one_cm": "骑乘炽足兽行进 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.swim_one_cm": "游泳 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.talked_to_villager": "与村民交谈 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.target_hit": "击中 %4$d 个标靶",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_death": "连续未死亡 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_rest": "连续未休息 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.total_world_time": "世界总时间 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.traded_with_villager": "与村民交易 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.trigger_trapped_chest": "触发 %4$d 次陷阱箱",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.tune_noteblock": "调谐 %4$d 次音符盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.use_cauldron": "使用炼药锅 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_on_water_one_cm": "在水上行走 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_one_cm": "行走 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_under_water_one_cm": "在水下行走 %4$d 厘米"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/betterstats/lang/zh_tw.json b/src/main/resources/assets/betterstats/lang/zh_tw.json
new file mode 100644
index 0000000..7063c32
--- /dev/null
+++ b/src/main/resources/assets/betterstats/lang/zh_tw.json
@@ -0,0 +1,198 @@
+{
+ "modmenu.nameTranslation.betterstats": "Better Statistics Screen",
+ "modmenu.summaryTranslation.betterstats": "一個改進統計畫面並使其更有用的 Minecraft 模組。",
+
+ "mobCategory.monster": "敵對生物",
+ "mobCategory.creature": "自然生物",
+ "mobCategory.ambient": "環境生物",
+ "mobCategory.axolotls": "美西螈",
+ "mobCategory.underground_water_creature": "地下水域生物",
+ "mobCategory.water_creature": "水域生物",
+ "mobCategory.water_ambient": "水域環境生物",
+ "mobCategory.misc": "其他生物",
+
+ "stat.blocksButton": "方塊",
+ "stat.betterstats.time_since_login": "本次會話時間",
+
+ "commands.statistics.edit.output": "為 %d 個玩家修改了統計資訊 %s。",
+ "commands.statistics.clear.output": "清除了 %d 個玩家的統計資訊。",
+ "commands.statistics.clear.kick": "你的統計資訊已被清理,請中斷連線並重新加入世界。",
+ "commands.statistics.query.output": "%s 的統計資訊 %s 的值為 %d。",
+
+ "betterstats.config.common.register_commands": "註冊指令",
+ "betterstats.config.common.register_commands.tooltip": "註冊此模組的指令(例如 '/statistics')。",
+ "betterstats.config.common.api_endpoint": "API 端點",
+ "betterstats.config.common.api_endpoint.tooltip": "此模組用於與此模組開發者的伺服器通訊的 RESTful HTTP API 端點的 URI 位址。",
+ "betterstats.config.common.experimental_features": "實驗性功能",
+ "betterstats.config.common.experimental_features.tooltip": "是否啟用實驗性功能。\n此類功能可能存在漏洞、導致崩潰或資料遺失。請自行承擔風險啟用,然後重啟遊戲。\n\n這些功能的存在並不代表它們最終會發布。它們可能隨時被移除,恕不另行通知。",
+ "betterstats.config.client.allow_chat_psa": "允許聊天 PSA 訊息",
+ "betterstats.config.client.allow_chat_psa.tooltip": "允許來自此模組開發者的罕見資訊性 PSA 訊息顯示在聊天欄中。關閉此選項以封鎖所有此類通知。",
+ "betterstats.config.client.gui_mobs_follow_cursor": "GUI 生物看向游標",
+ "betterstats.config.client.gui_mobs_follow_cursor.tooltip": "實體統計資訊 GUI 中的生物會始終看向游標位置。",
+
+ "betterstats.gui.screen.edit_siv_goal.stat_type": "統計類型(活動)",
+ "betterstats.gui.screen.edit_siv_goal.stat_subject": "統計主題(物品/實體等)",
+ "betterstats.gui.screen.edit_siv_goal.target_value_range": "目標數值範圍",
+
+ "betterstats.gui.menubar.file": "檔案",
+ "betterstats.gui.menubar.file.new": "新增",
+ "betterstats.gui.menubar.file.open": "開啟",
+ "betterstats.gui.menubar.file.save_as": "另存為",
+ "betterstats.gui.menubar.file.settings": "設定",
+ "betterstats.gui.menubar.file.close": "關閉",
+ "betterstats.gui.menubar.view": "檢視",
+ "betterstats.gui.menubar.view.vanilla_screen": "原版畫面",
+ "betterstats.gui.menubar.view.homepage": "首頁",
+ "betterstats.gui.menubar.view.local_player_stats": "我的統計資訊",
+ "betterstats.gui.menubar.view.stats_view": "切換檢視",
+ "betterstats.gui.menubar.about": "關於",
+ "betterstats.gui.menubar.about.source_code": "原始碼",
+ "betterstats.gui.menubar.about.support_me": "支持我",
+ "betterstats.gui.menubar.about.legal_notices": "法律聲明",
+
+ "betterstats.gui.statsview.filters": "篩選",
+ "betterstats.gui.statsview.filter.selected_view": "選擇的檢視",
+ "betterstats.gui.statsview.filter.search": "搜尋",
+ "betterstats.gui.statsview.filter.show_all_stats": "顯示所有統計資訊",
+ "betterstats.gui.statsview.filter.hide_completed_goals": "隱藏已完成的目標",
+ "betterstats.gui.statsview.filter.sort_by": "排序方式",
+ "betterstats.gui.statsview.filter.group_by": "分組方式",
+ "betterstats.gui.statsview.filter.group_by.all": "全部",
+ "betterstats.gui.statsview.filter.group_by.mod": "模組名稱",
+ "betterstats.gui.statsview.filter.group_by.mob_category": "生物類別",
+ "betterstats.gui.statsview.filter.group_by.creative_mode_tab": "創造模式分頁",
+ "betterstats.gui.statsview.filter.distance_unit": "距離單位",
+ "betterstats.gui.statsview.filter.time_unit": "時間單位",
+ "betterstats.gui.statsview.stats.no_stats": "暫無可顯示的統計資訊……",
+ "betterstats.gui.statsview.stats.no_goals": "暫無可顯示的目標……",
+ "betterstats.gui.statsview.stats.ctxmenu.view_error_info": "查看錯誤資訊",
+ "betterstats.gui.statsview.stats.ctxmenu.view_on_wiki": "在 Wiki 上查看",
+ "betterstats.gui.statsview.stats.ctxmenu.create_goal": "建立目標",
+ "betterstats.gui.statsview.mcbs_goals": "目標",
+ "betterstats.gui.statsview.mcbs_goals.alert1.prefix": "[新功能 ✨]",
+ "betterstats.gui.statsview.mcbs_goals.alert1": "定義自訂里程碑,以追蹤您在特定統計目標(如資源收集)上的進度。",
+ "betterstats.gui.statsview.mcbs_goals.alert2.prefix": "[注意 💾]",
+ "betterstats.gui.statsview.mcbs_goals.alert2": "這些目標在重新加入或重啟後不會保留。此缺失功能可能在將來實現。",
+ "betterstats.gui.statsview.mcbs_goals.overview": "概覽",
+ "betterstats.gui.statsview.mcbs_goals.overview.completed_goals": "已完成的目標",
+ "betterstats.gui.statsview.mcbs_goals.overview.total_progress": "總進度",
+ "betterstats.gui.statsview.mcbs_goals.new_btn": "[ + 新增目標 ]",
+ "betterstats.gui.statsview.mcbs_goals.manage_btn": "管理目標",
+ "betterstats.gui.statsview.mcbs_goals.edit_btn": "編輯目標",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn": "刪除目標",
+ "betterstats.gui.statsview.mcbs_goals.delete_btn.confirm": "確定要刪除嗎?",
+ "betterstats.gui.statsview.mcbs_goals.no_edit_gui": "此目標類型沒有編輯介面。",
+
+ "betterstats.gui.home_tab.featured_stats": "精選統計",
+
+ "betterstats.credits": "鳴謝",
+ "betterstats.credits.section.top_sponsors": "頂級贊助者",
+ "betterstats.credits.section.top_sponsors.summary": "對本專案貢獻最大的資金支持者。",
+ "betterstats.credits.section.recent_sponsors": "近期贊助者",
+ "betterstats.credits.section.recent_sponsors.summary": "對本專案最近的資金支持者。",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor": "[+] [贊助]",
+ "betterstats.credits.section.recent_sponsors.entry.sponsor.summary": "成為贊助者,為此模組及其開發貢獻力量。",
+ "betterstats.credits.section.special_thanks": "特別鳴謝",
+ "betterstats.credits.section.special_thanks.summary": "特別鳴謝以及讓此模組成為可能的人們。",
+ "betterstats.credits.section.special_thanks.entry.you": "[您]",
+ "betterstats.credits.section.special_thanks.entry.you.summary": "特別感謝您,感謝您的支持以及幫助此模組保持活力。",
+ "betterstats.credits.section.special_thanks.entry.contributors": "[貢獻者]",
+ "betterstats.credits.section.special_thanks.entry.contributors.summary": "所有為此模組做出貢獻、回報漏洞和提供反饋的人。您的幫助意義重大。",
+ "betterstats.credits.section.contributors": "貢獻者",
+ "betterstats.credits.section.contributors.summary": "在 v5.X 版本期間為此模組做出貢獻的社群成員。",
+ "betterstats.credits.section.contributors.entry.contribute": "[+] [參與貢獻]",
+ "betterstats.credits.section.contributors.entry.contribute.summary": "參與此模組的開發,以名列此榜單。",
+ "betterstats.credits.section.founder_contributors": "創始貢獻者",
+ "betterstats.credits.section.founder_contributors.summary": "在 v5.X 版本之前為此模組做出貢獻的社群成員。",
+
+ "betterstats.mcbsgoaltype.betterstats.stat_int_value": "通用數值目標",
+
+ "betterstats.mcbsgoal.siv_objective": "%2$s 的 %1$s 達到 %4$d",
+ "betterstats.mcbsgoal.siv_objective.betterstats.edit_this_goal": "編輯此目標",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom": "執行 %2$s %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.broken": "破壞 %4$d 個 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.crafted": "合成 %4$d 個 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.dropped": "丟棄 %4$d 個 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.mined": "開採 %4$d 個 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.picked_up": "拾取 %4$d 個 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.used": "使用 %4$d 個 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed": "殺死 %4$d 個 %2$s",
+ "betterstats.mcbsgoal.siv_objective.minecraft.killed_by": "被 %2$s 殺死 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.animals_bred": "繁殖 %4$d 隻動物",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.aviate_one_cm": "用鞘翅飛行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.bell_ring": "敲響 %4$d 次鐘",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.boat_one_cm": "划船行進 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_armor": "清洗 %4$d 件盔甲",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_banner": "清洗 %4$d 面旗幟",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.clean_shulker_box": "清洗 %4$d 個界伏盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.climb_one_cm": "攀爬 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.crouch_one_cm": "潛行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_absorbed": "吸收 %4$d 點傷害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_blocked_by_shield": "用盾牌格擋 %4$d 點傷害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt": "造成 %4$d 點傷害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_absorbed": "造成 %4$d 點傷害(被吸收)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_dealt_resisted": "造成 %4$d 點傷害(被抵抗)",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_resisted": "抵抗 %4$d 點傷害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.damage_taken": "受到 %4$d 點傷害",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.deaths": "死亡 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.drop": "丟棄 %4$d 個物品",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.eat_cake_slice": "吃掉 %4$d 片蛋糕",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.enchant_item": "附魔 %4$d 個物品",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fall_one_cm": "摔落 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fill_cauldron": "填充 %4$d 個鍋釜",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fish_caught": "釣到 %4$d 條魚",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.fly_one_cm": "飛行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.happy_ghast_one_cm": "騎乘開心惡魂飛行 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.horse_one_cm": "騎馬行進 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dispenser": "查看 %4$d 個發射器",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_dropper": "查看 %4$d 個投擲器",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.inspect_hopper": "查看 %4$d 個漏斗",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_anvil": "與鐵砧互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_beacon": "與烽火台互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_blast_furnace": "與高爐互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_brewingstand": "與釀造台互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_campfire": "與營火互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_cartography_table": "與製圖台互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_crafting_table": "與工作台互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_furnace": "與熔爐互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_grindstone": "與砂輪互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_lectern": "與講台互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_loom": "與織布機互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smithing_table": "與鍛造台互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_smoker": "與煙燻爐互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.interact_with_stonecutter": "與切石機互動 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.jump": "跳躍 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.leave_game": "退出遊戲 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.minecart_one_cm": "乘坐礦車行進 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.mob_kills": "殺死 %4$d 隻生物",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.nautilus_one_cm": "乘坐鸚鵡螺行進 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_barrel": "開啟 %4$d 個木桶",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_chest": "開啟 %4$d 個箱子",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_enderchest": "開啟 %4$d 個終界箱",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.open_shulker_box": "開啟 %4$d 個界伏盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pig_one_cm": "騎豬行進 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_noteblock": "播放 %4$d 次音階盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_record": "播放 %4$d 張唱片",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.play_time": "遊玩 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.player_kills": "殺死 %4$d 個玩家",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.pot_flower": "盆栽 %4$d 株植物",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_trigger": "觸發 %4$d 次襲擊",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.raid_win": "贏得 %4$d 次襲擊",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sleep_in_bed": "睡覺 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sneak_time": "潛行 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.sprint_one_cm": "疾跑 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.strider_one_cm": "騎乘熾足獸行進 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.swim_one_cm": "游泳 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.talked_to_villager": "與村民交談 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.target_hit": "擊中 %4$d 個標靶",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_death": "連續未死亡 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.time_since_rest": "連續未休息 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.total_world_time": "世界總時間 %4$d 刻",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.traded_with_villager": "與村民交易 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.trigger_trapped_chest": "觸發 %4$d 次陷阱箱",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.tune_noteblock": "調諧 %4$d 次音階盒",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.use_cauldron": "使用鍋釜 %4$d 次",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_on_water_one_cm": "在水上行走 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_one_cm": "行走 %4$d 厘米",
+ "betterstats.mcbsgoal.siv_objective.minecraft.custom.minecraft.walk_under_water_one_cm": "在水下行走 %4$d 厘米"
+}
\ No newline at end of file
diff --git a/src/main/resources/betterstats.credits.json b/src/main/resources/betterstats.credits.json
index 1a0fea5..f1a1dee 100644
--- a/src/main/resources/betterstats.credits.json
+++ b/src/main/resources/betterstats.credits.json
@@ -6,12 +6,36 @@
"summary": { "translate": "betterstats.credits.section.contributors.summary" },
"entries":
[
+ {
+ "avatar_uri": "https://avatars.githubusercontent.com/u/131694536?v=4",
+ "name": "ADevnin",
+ "summary": "Translated this mod to 'Russian'.",
+ "homepage_uri": "https://github.com/ADevnin"
+ },
+ {
+ "avatar_uri": "https://avatars.githubusercontent.com/u/268278061?v=4",
+ "name": "JustShadow78",
+ "summary": "Translated this mod to 'Polish'.",
+ "homepage_uri": "https://github.com/JustShadow78"
+ },
+ {
+ "avatar_uri": "https://avatars.githubusercontent.com/u/306860017?v=4",
+ "name": "Ultra0641",
+ "summary": "Translated this mod to 'German'.",
+ "homepage_uri": "https://github.com/Ultra0641"
+ },
{
"avatar_uri": "https://avatars.githubusercontent.com/u/110760354?v=4",
"name": "WForst-Breeze",
"summary": "Translated this mod to 'Simplified Chinese'.",
"homepage_uri": "https://github.com/WForst-Breeze"
},
+ {
+ "avatar_uri": "https://avatars.githubusercontent.com/u/150860092?v=4",
+ "name": "Xinyang-Gao",
+ "summary": "Translated this mod to 'Simplified Chinese' and 'Traditional Chinese'.",
+ "homepage_uri": "https://github.com/Xinyang-Gao"
+ },
{
"avatar_uri": null,
"name": { "translate": "betterstats.credits.section.contributors.entry.contribute" },