From 1c1a8b386ba6ccf19e561f93ef64aaf1dd959739 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 10:51:06 -0700 Subject: [PATCH 01/95] Update CLAUDE.md to reflect current project state Add new managers, SQLite database support, expanded hook integrations, and bump version reference from 3.11.2 to 3.13.0. Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 124ce339b..736152c2a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -32,13 +32,13 @@ The main plugin class is `BentoBox.java` (extends `JavaPlugin`). Almost all subs ### Key Packages - **`api/`** — Public API surface for addons: events, commands, panels (GUIs), user management, flags, configuration -- **`managers/`** — Core subsystems: `IslandsManager`, `PlayersManager`, `AddonsManager`, `LocalesManager`, `FlagsManager`, `BlueprintsManager`, `HooksManager`, `PlaceholdersManager`, `RanksManager` -- **`database/`** — Database abstraction supporting MongoDB, MySQL, MariaDB, and PostgreSQL (via HikariCP) +- **`managers/`** — Core subsystems: `IslandsManager`, `PlayersManager`, `AddonsManager`, `LocalesManager`, `FlagsManager`, `BlueprintsManager`, `BlueprintClipboardManager`, `HooksManager`, `PlaceholdersManager`, `RanksManager`, `CommandsManager`, `IslandDeletionManager`, `IslandChunkDeletionManager`, `MapManager`, `WebManager` +- **`database/`** — Database abstraction supporting MongoDB, MySQL, MariaDB, PostgreSQL (via HikariCP), and SQLite - **`blueprints/`** — Island schematic handling and pasting - **`listeners/`** — Bukkit event handlers (teleport, death, join/leave, panel clicks, spawn protection) - **`commands/`** — Admin and user command implementations - **`panels/`** — Inventory GUI panel system -- **`hooks/`** — Integrations with external plugins (Vault, PlaceholderAPI, MythicMobs, Multiverse, LuckPerms, etc.) +- **`hooks/`** — Integrations with external plugins (Vault, PlaceholderAPI, MythicMobs, Multiverse, LuckPerms, ItemsAdder, Slimefun, Oraxen, ZNPCsPlus, FancyNpcs, BlueMap, Dynmap, LangUtils, etc.) - **`nms/`** — NMS (Native Minecraft Server) version-specific code ### Island Data Flow @@ -123,4 +123,4 @@ Guava (`ImmutableSet`, `ImmutableList`, etc.) is reliably available at runtime v - The Gradle build uses the Paper `userdev` plugin and Shadow plugin to produce a fat/shaded JAR at `build/libs/BentoBox-{version}.jar`. - `plugin.yml` and `config.yml` are filtered for the `${version}` placeholder at build time; locale files are copied without filtering. - Java preview features are enabled for both compilation and test execution. -- Local builds produce version `3.11.2-LOCAL-SNAPSHOT`; CI builds append `-b{BUILD_NUMBER}-SNAPSHOT`; `origin/master` builds produce the bare version. +- Local builds produce version `3.13.0-LOCAL-SNAPSHOT`; CI builds append `-b{BUILD_NUMBER}-SNAPSHOT`; `origin/master` builds produce the bare version. From bd5febca157a81ac9a9073d5bc7816ce1d7f5961 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 17:25:49 -0700 Subject: [PATCH 02/95] Support Minecraft 26.1.1 world file structure in region purge In 26.1.1, dimensions moved to dimensions/minecraft// with no DIM-1/DIM1 subfolders, and player data moved to /players/data/. Update path resolution to detect and support both old and new formats. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../admin/purge/AdminPurgeRegionsCommand.java | 103 ++++++++++++++++-- 1 file changed, 93 insertions(+), 10 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java index 4b39d049f..1709ad4cf 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java @@ -41,6 +41,9 @@ public class AdminPurgeRegionsCommand extends CompositeCommand implements Listen private static final String ENTITIES = "entities"; private static final String POI = "poi"; private static final String DIM_1 = "DIM-1"; + private static final String DIM1 = "DIM1"; + private static final String PLAYERS = "players"; + private static final String PLAYERDATA = "playerdata"; private static final String IN_WORLD = " in world "; private static final String WILL_BE_DELETED = " will be deleted"; private static final String EXISTS_PREFIX = " (exists="; @@ -152,7 +155,7 @@ private boolean deleteEverything() { } private void deletePlayerFromWorldFolder(String islandID) { - File playerData = new File(getWorld().getWorldFolder(), "playerdata"); + File playerData = resolvePlayerDataFolder(); getPlugin().getIslands().getIslandById(islandID) .ifPresent(island -> island.getMemberSet() .forEach(uuid -> maybeDeletePlayerData(uuid, playerData))); @@ -197,11 +200,14 @@ private void deletePlayerFile(File file, String description) { /** * Resolves the base data folder for a world, accounting for the dimension - * subfolder that Minecraft uses for non-overworld environments. + * subfolder layout. *

- * Overworld data lives directly in the world folder, but Nether data lives - * in {@code DIM-1/} and End data lives in {@code DIM1/} subfolders - even - * when the world has its own separate folder. + * Pre-26.1 (old format): Nether data lives in {@code DIM-1/} and + * End data lives in {@code DIM1/} subfolders inside the world folder. + *

+ * 26.1.1+ (new format): Each dimension has its own world folder + * under {@code dimensions/minecraft/} and data (region/, entities/, poi/) + * lives directly in it — no DIM-1/DIM1 subfolders. * * @param world the world to resolve * @return the base folder containing region/, entities/, poi/ subfolders @@ -214,13 +220,90 @@ private File resolveDataFolder(World world) { yield dim.isDirectory() ? dim : worldFolder; } case THE_END -> { - File dim = new File(worldFolder, "DIM1"); + File dim = new File(worldFolder, DIM1); yield dim.isDirectory() ? dim : worldFolder; } default -> worldFolder; }; } + /** + * Resolves the player data folder, supporting both old and new formats. + *

+ * Pre-26.1: {@code /playerdata/} + *

+ * 26.1.1+: {@code /players/data/} (centralized) + * + * @return the folder containing player .dat files + */ + private File resolvePlayerDataFolder() { + File worldFolder = getWorld().getWorldFolder(); + // Old format + File oldPath = new File(worldFolder, PLAYERDATA); + if (oldPath.isDirectory()) { + return oldPath; + } + // New 26.1.1 format: walk up from dimensions/minecraft// to world root + File root = worldFolder.getParentFile(); // minecraft/ + if (root != null) root = root.getParentFile(); // dimensions/ + if (root != null) root = root.getParentFile(); // world root + if (root != null) { + File newPath = new File(root, PLAYERS + File.separator + "data"); + if (newPath.isDirectory()) { + return newPath; + } + } + return oldPath; // fallback + } + + /** + * Resolves the nether data folder when the Nether World object is unavailable. + * Tries the old DIM-1 subfolder first, then the 26.1.1 sibling world folder. + * + * @param overworldFolder the overworld's world folder + * @return the nether base folder (may not exist) + */ + private File resolveNetherFallback(File overworldFolder) { + // Old format: /DIM-1/ + File dim = new File(overworldFolder, DIM_1); + if (dim.isDirectory()) { + return dim; + } + // New 26.1.1 format: sibling folder _nether in same parent + File parent = overworldFolder.getParentFile(); + if (parent != null) { + File sibling = new File(parent, overworldFolder.getName() + "_nether"); + if (sibling.isDirectory()) { + return sibling; + } + } + return dim; // fallback to old path + } + + /** + * Resolves the end data folder when the End World object is unavailable. + * Tries the old DIM1 subfolder first, then the 26.1.1 sibling world folder. + * + * @param overworldFolder the overworld's world folder + * @return the end base folder (may not exist) + */ + private File resolveEndFallback(File overworldFolder) { + // Old format: /DIM1/ + File dim = new File(overworldFolder, DIM1); + if (dim.isDirectory()) { + return dim; + } + // New 26.1.1 format: sibling folder _the_end in same parent + File parent = overworldFolder.getParentFile(); + if (parent != null) { + File sibling = new File(parent, overworldFolder.getName() + "_the_end"); + if (sibling.isDirectory()) { + return sibling; + } + } + return dim; // fallback to old path + } + /** * Deletes a file if it exists, logging an error if deletion fails. * Does not log if the parent folder does not exist (normal for entities/poi). @@ -261,13 +344,13 @@ private boolean deleteRegionFiles() { File overworldPoi = new File(base, POI); World netherWorld = getPlugin().getIWM().getNetherWorld(world); - File netherBase = netherWorld != null ? resolveDataFolder(netherWorld) : new File(base, DIM_1); + File netherBase = netherWorld != null ? resolveDataFolder(netherWorld) : resolveNetherFallback(base); File netherRegion = new File(netherBase, REGION); File netherEntities = new File(netherBase, ENTITIES); File netherPoi = new File(netherBase, POI); World endWorld = getPlugin().getIWM().getEndWorld(world); - File endBase = endWorld != null ? resolveDataFolder(endWorld) : new File(base, "DIM1"); + File endBase = endWorld != null ? resolveDataFolder(endWorld) : resolveEndFallback(base); File endRegion = new File(endBase, REGION); File endEntities = new File(endBase, ENTITIES); File endPoi = new File(endBase, POI); @@ -550,11 +633,11 @@ private List> findOldRegions(int days) { File overworldRegion = new File(worldDir, REGION); World netherWorld = getPlugin().getIWM().getNetherWorld(world); - File netherBase = netherWorld != null ? resolveDataFolder(netherWorld) : new File(worldDir, DIM_1); + File netherBase = netherWorld != null ? resolveDataFolder(netherWorld) : resolveNetherFallback(worldDir); File netherRegion = new File(netherBase, REGION); World endWorld = getPlugin().getIWM().getEndWorld(world); - File endBase = endWorld != null ? resolveDataFolder(endWorld) : new File(worldDir, "DIM1"); + File endBase = endWorld != null ? resolveDataFolder(endWorld) : resolveEndFallback(worldDir); File endRegion = new File(endBase, REGION); long cutoffMillis = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(days); From 5ae0f4ae24e116414ee31a29a56be7d26a448fab Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 17:42:28 -0700 Subject: [PATCH 03/95] Update build version from 3.13.0 to 3.13.1 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index f73d12a9a..3bee23186 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,7 +46,7 @@ paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArt group = "world.bentobox" // From // Base properties from -val buildVersion = "3.13.0" +val buildVersion = "3.13.1" val buildNumberDefault = "-LOCAL" // Local build identifier val snapshotSuffix = "-SNAPSHOT" // Indicates development/snapshot version From c2b161b1dee8e38074591511dbda7b4961cc5169 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 01:17:54 +0000 Subject: [PATCH 04/95] Initial plan From 2c798a67451b551cfb4a2e09459bb4d59eb28e98 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 01:39:00 +0000 Subject: [PATCH 05/95] Fix MiniMessage formatting: disable default italic on panel items and fix tag nesting in legacyToMiniMessage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two issues fixed: 1. Panel item names and lore were rendered italic by default because Minecraft applies italic styling to item components. Now explicitly sets italic=false on the root component when not already set. 2. legacyToMiniMessage produced cross-nested tags when bold/decorations carried through a color code change without §r reset, causing closing tags like to appear as literal text. Now properly closes and reopens decoration tags around color changes to maintain valid nesting. Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/f04f5542-587b-4770-917c-d7a22a86563c Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../bentobox/api/panels/PanelItem.java | 21 ++- .../world/bentobox/bentobox/util/Util.java | 37 +++-- .../bentobox/api/panels/PanelItemTest.java | 50 +++++++ .../util/LegacyToMiniMessageTest.java | 133 ++++++++++++++++++ 4 files changed, 232 insertions(+), 9 deletions(-) create mode 100644 src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java diff --git a/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java b/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java index cccd2f7f2..f43ce010f 100644 --- a/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java +++ b/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java @@ -4,6 +4,9 @@ import java.util.List; import java.util.Optional; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; + import org.bukkit.enchantments.Enchantment; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemFlag; @@ -78,6 +81,7 @@ public void setDescription(List description) { if (meta != null) { meta.lore(description.stream() .map(Util::parseMiniMessageOrLegacy) + .map(PanelItem::removeDefaultItalic) .toList()); icon.setItemMeta(meta); } @@ -90,7 +94,7 @@ public String getName() { public void setName(String name) { this.name = name; if (meta != null) { - meta.displayName(name != null ? Util.parseMiniMessageOrLegacy(name) : null); + meta.displayName(name != null ? removeDefaultItalic(Util.parseMiniMessageOrLegacy(name)) : null); icon.setItemMeta(meta); } } @@ -193,6 +197,21 @@ public interface ClickHandler { boolean onClick(Panel panel, User user, ClickType clickType, int slot); } + /** + * Removes the default italic styling that Minecraft applies to item display names and lore. + * If the component does not explicitly set italic, this method sets it to false to prevent + * the Minecraft client from applying its default italic rendering. + * + * @param component the component to process + * @return the component with italic explicitly disabled if it was not already set + */ + private static Component removeDefaultItalic(Component component) { + if (component.decoration(TextDecoration.ITALIC) == TextDecoration.State.NOT_SET) { + return component.decoration(TextDecoration.ITALIC, TextDecoration.State.FALSE); + } + return component; + } + public void setHead(ItemStack itemStack) { // update amount before replacing. itemStack.setAmount(this.icon.getAmount()); diff --git a/src/main/java/world/bentobox/bentobox/util/Util.java b/src/main/java/world/bentobox/bentobox/util/Util.java index de4c8b576..cb934bfa7 100644 --- a/src/main/java/world/bentobox/bentobox/util/Util.java +++ b/src/main/java/world/bentobox/bentobox/util/Util.java @@ -1074,19 +1074,29 @@ public static String legacyToMiniMessage(@NonNull String legacy) { || mmTag.equals("underlined") || mmTag.equals("strikethrough") || mmTag.equals("obfuscated"); if (!isDecoration) { - // Close previous color tags (not decorations) + // Close previous color tags (not decorations). + // To maintain proper MiniMessage nesting, close any decoration + // tags that sit inside color tags first, then reopen them after. + List decorationsToReopen = new ArrayList<>(); for (int j = openTags.size() - 1; j >= 0; j--) { String tag = openTags.get(j); - if (!tag.equals("bold") && !tag.equals("italic") && !tag.equals("underlined") - && !tag.equals("strikethrough") && !tag.equals("obfuscated") - && !tag.startsWith("color:")) { + if (tag.equals("bold") || tag.equals("italic") || tag.equals("underlined") + || tag.equals("strikethrough") || tag.equals("obfuscated")) { + // Close decoration temporarily to maintain nesting result.append(""); + decorationsToReopen.add(0, tag); openTags.remove(j); - } else if (tag.startsWith("color:")) { + } else { + // Named color or color:# tag — close it result.append(""); openTags.remove(j); } } + // Reopen decorations so they continue through the new color + for (String dec : decorationsToReopen) { + result.append("<").append(dec).append(">"); + openTags.add(dec); + } } result.append("<").append(mmTag).append(">"); openTags.add(mmTag); @@ -1099,15 +1109,26 @@ public static String legacyToMiniMessage(@NonNull String legacy) { int end = text.indexOf('>', i); if (end != -1) { String colorTag = text.substring(i + 1, end); - // Close previous color tags + // Close previous color tags, preserving decoration nesting + List decorationsToReopen = new ArrayList<>(); for (int j = openTags.size() - 1; j >= 0; j--) { String tag = openTags.get(j); - if (!tag.equals("bold") && !tag.equals("italic") && !tag.equals("underlined") - && !tag.equals("strikethrough") && !tag.equals("obfuscated")) { + if (tag.equals("bold") || tag.equals("italic") || tag.equals("underlined") + || tag.equals("strikethrough") || tag.equals("obfuscated")) { + // Close decoration temporarily to maintain nesting + result.append(""); + decorationsToReopen.add(0, tag); + openTags.remove(j); + } else { result.append(""); openTags.remove(j); } } + // Reopen decorations so they continue through the new color + for (String dec : decorationsToReopen) { + result.append("<").append(dec).append(">"); + openTags.add(dec); + } result.append("<").append(colorTag).append(">"); openTags.add(colorTag); i = end + 1; diff --git a/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java b/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java index b010a9414..60945088d 100644 --- a/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java +++ b/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java @@ -12,6 +12,9 @@ import java.util.List; import java.util.Optional; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; + import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; @@ -19,6 +22,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import world.bentobox.bentobox.CommonTestSetup; @@ -211,4 +215,50 @@ void testSetHead() { verify(ph, times(3)).setItemMeta(itemMeta); } + /** + * Test that setName sets italic to false on the component to prevent + * Minecraft's default italic rendering on item display names. + */ + @Test + void testSetNameDisablesDefaultItalic() { + ItemStack itemStack = mock(ItemStack.class); + ItemMeta itemMeta = mock(ItemMeta.class); + when(itemStack.getType()).thenReturn(Material.STONE); + when(itemStack.getItemMeta()).thenReturn(itemMeta); + when(pib.getIcon()).thenReturn(itemStack); + when(pib.getName()).thenReturn("Test Name"); + + PanelItem item = new PanelItem(pib); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Component.class); + verify(itemMeta).displayName(captor.capture()); + Component nameComponent = captor.getValue(); + assertEquals(TextDecoration.State.FALSE, nameComponent.decoration(TextDecoration.ITALIC)); + } + + /** + * Test that setDescription sets italic to false on each lore component to prevent + * Minecraft's default italic rendering on item lore. + */ + @SuppressWarnings("unchecked") + @Test + void testSetDescriptionDisablesDefaultItalic() { + ItemStack itemStack = mock(ItemStack.class); + ItemMeta itemMeta = mock(ItemMeta.class); + when(itemStack.getType()).thenReturn(Material.STONE); + when(itemStack.getItemMeta()).thenReturn(itemMeta); + when(pib.getIcon()).thenReturn(itemStack); + when(pib.getDescription()).thenReturn(List.of("Line 1", "Line 2")); + + PanelItem item = new PanelItem(pib); + + ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); + verify(itemMeta).lore(captor.capture()); + List loreComponents = captor.getValue(); + assertEquals(2, loreComponents.size()); + for (Component c : loreComponents) { + assertEquals(TextDecoration.State.FALSE, c.decoration(TextDecoration.ITALIC)); + } + } + } diff --git a/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java new file mode 100644 index 000000000..5388cb111 --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java @@ -0,0 +1,133 @@ +package world.bentobox.bentobox.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import world.bentobox.bentobox.CommonTestSetup; + +/** + * Tests that {@link Util#legacyToMiniMessage(String)} produces properly nested MiniMessage tags, + * especially when legacy decoration codes (bold, italic, etc.) carry through color code changes. + */ +class LegacyToMiniMessageTest extends CommonTestSetup { + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); + } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } + + /** + * When bold carries through a color change (no §r reset), the MiniMessage output + * must still produce properly nested tags so that MiniMessage does not render + * closing tags as literal text. + */ + @Test + void testBoldCarriesThroughColorChange() { + // §c§l = red bold, then §a = green (bold continues in legacy) + String legacy = "§aResets §c§lALL §athe settings to their§r"; + String miniMsg = Util.legacyToMiniMessage(legacy); + + // Parse the MiniMessage output and check no tags appear as literal text + Component comp = Util.parseMiniMessage(miniMsg); + String plainText = PlainTextComponentSerializer.plainText().serialize(comp); + + assertFalse(plainText.contains(""), + "Plain text should not contain literal tag but was: " + plainText); + assertTrue(plainText.contains("Resets"), + "Expected content 'Resets' missing: " + plainText); + assertTrue(plainText.contains("ALL"), + "Expected content 'ALL' missing: " + plainText); + assertTrue(plainText.contains("the settings to their"), + "Expected content 'the settings to their' missing: " + plainText); + } + + /** + * When §r is present, the output should have properly nested tags with bold NOT + * continuing through the color change. + */ + @Test + void testBoldStopsAtReset() { + String legacy = "§aResets §c§lALL §r§athe settings to their§r"; + String miniMsg = Util.legacyToMiniMessage(legacy); + + Component comp = Util.parseMiniMessage(miniMsg); + String plainText = PlainTextComponentSerializer.plainText().serialize(comp); + + assertFalse(plainText.contains(""), + "Plain text should not contain literal tag but was: " + plainText); + assertEquals("Resets ALL the settings to their", plainText); + } + + /** + * The full MiniMessage → legacy → MiniMessage roundtrip must not produce literal tags + * in the final output. + */ + @Test + void testRoundTripDoesNotProduceLiteralTags() { + String original = "Resets ALL the settings to their"; + + // MiniMessage → Component → Legacy + Component comp = Util.parseMiniMessage(original); + String legacy = Util.componentToLegacy(comp); + + // Legacy → MiniMessage → Component + Component finalComp = Util.parseMiniMessageOrLegacy(legacy); + String plainText = PlainTextComponentSerializer.plainText().serialize(finalComp); + + assertFalse(plainText.contains(""), + "Round-trip should not produce literal : " + plainText); + assertFalse(plainText.contains(""), + "Round-trip should not produce literal : " + plainText); + assertEquals("Resets ALL the settings to their", plainText); + } + + /** + * Multiple decorations (bold + italic) carrying through a color change should + * all be properly nested. + */ + @Test + void testMultipleDecorationsCarryThroughColorChange() { + // §c§l§o = red bold italic, then §a = green (both bold and italic continue) + String legacy = "§c§l§oText1 §aText2§r"; + String miniMsg = Util.legacyToMiniMessage(legacy); + + Component comp = Util.parseMiniMessage(miniMsg); + String plainText = PlainTextComponentSerializer.plainText().serialize(comp); + + assertFalse(plainText.contains(""), + "Plain text should not contain literal : " + plainText); + assertFalse(plainText.contains(""), + "Plain text should not contain literal : " + plainText); + assertEquals("Text1 Text2", plainText); + } + + /** + * Hex color codes (&#RRGGBB) with bold should also produce proper nesting. + */ + @Test + void testBoldCarriesThroughHexColor() { + String legacy = "§lBold &#FF0000Red§r"; + String miniMsg = Util.legacyToMiniMessage(legacy); + + Component comp = Util.parseMiniMessage(miniMsg); + String plainText = PlainTextComponentSerializer.plainText().serialize(comp); + + assertFalse(plainText.contains(""), + "Plain text should not contain literal : " + plainText); + assertEquals("Bold Red", plainText); + } +} From 7a4cdd4bf5b87591ced421f8dced32a6469f3625 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 20:44:37 -0700 Subject: [PATCH 06/95] Fix Czech (cs.yml) locale: correct mistranslations, typos, broken tags, and untranslated strings Fixes Spanish text in general.beta, untranslated English in SPAWN_PROTECTION and other keys, fish terminology misused for spawning, "media player" vs "game player", broken MiniMessage tags (& instead of ), numerous typos, and garbled machine-translated phrases throughout the file. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/cs.yml | 244 +++++++++++++++--------------- 1 file changed, 122 insertions(+), 122 deletions(-) diff --git a/src/main/resources/locales/cs.yml b/src/main/resources/locales/cs.yml index be7ce6b52..782a760e2 100644 --- a/src/main/resources/locales/cs.yml +++ b/src/main/resources/locales/cs.yml @@ -13,7 +13,7 @@ prefixes: general: success: 'Povedlo se!' invalid: Neplatné - beta: 'Este comando está en beta. ¡Asegúrate de tener copias de seguridad!' + beta: 'Tento příkaz je v beta verzi. Ujisti se, že máš zálohy!' errors: command-cancelled: 'Příkaz zrušen.' no-permission: 'Nemáš oprávnění k provedení tohoto příkazu ([permission]).' @@ -139,7 +139,7 @@ commands: team: description: řídit týmy add: - parameters: + parameters: description: přidat hráče k týmu vlastníka name-not-owner: '[name] není vlastník.' name-has-island: '[name] má ostrov. Nejdříve ho odregistruj nebo smaž!' @@ -219,7 +219,7 @@ commands: Úspěšně zvětšena chráněná oblast ostrova hráče [name]na [total] (+[number]). remove: - description: decreases the island protected range + description: zmenší chráněnou oblast ostrova parameters: success: >- Úspěšně zmenšena chráněná oblast ostrova hráče [name]na @@ -328,7 +328,7 @@ commands: Nebyl nalezen bezpečný warp! Teleportuj se manuálně na [location] a podívej se na to tpuser: - parameters: <[prefix_island] s přehrávačem> [player's island] + parameters: <[prefix_island] hráče> [hráčův ostrov] description: Teleport hráče na [prefix_island] jiného hráče getrank: parameters: [island owner] @@ -399,8 +399,8 @@ commands: sink: description: Položte tento plán, aby se ponořil do oceánského dna status: 'Blueprint bude [status], když je vložen' - sink: 'dřez' - not-sink: 'ne ponořit' + sink: 'ponořit' + not-sink: 'neponořit' no-clipboard: 'Ve schránce není žádný plán. Načíst nebo zkopírovat něco.' delete: parameters: @@ -489,8 +489,8 @@ commands: Klikni pravým myšítkem ke snížení times: | Max souběžné použití hráčem - Levý kliknutí na přírůstek - Kliknutím pravým tlačítkem pravým tlačítkem + Levý klik pro zvýšení + Pravý klik pro snížení unlimited-times: Neomezený maximum-times: Max [number] krát cost: | @@ -532,7 +532,7 @@ commands: možné smazat. deleted-island: 'Ostrov na [xyz] byl úspěšně smazán.' deletehomes: - parameters: + parameters: description: odstraní všechny pojmenované domy z ostrova warning: 'Všechny pojmenované domy budou z ostrova smazány!' why: @@ -655,7 +655,7 @@ commands: no-spawn: 'V tomto světě není žádný spawn.' create: description: vytvořit ostrov, s použitím volitelné předlohy (vyžaduje oprávnění) - parameters: + parameters: too-many-islands: >- Je zde příliš mnoho ostrovů v tomto světě: není zde dostatek místa k vytvoření toho tvého. @@ -700,7 +700,7 @@ commands: no-neighbors: 'Nemáš bezprostřední sousední ostrovy!' reset: description: restartuj svůj ostrov a smaž svůj předchozí - parameters: + parameters: none-left: 'Již jsi vyčerpal počet svých restartů!' resets-left: 'Ještě máš [number] zbývajících restartů' confirmation: |- @@ -753,26 +753,26 @@ commands: rank-filter: name: Rank filtr description: 'Kliknutím do řad cyklu' - invitation: Pozvání + invitation: Pozvánka invite: - name: Pozvěte hráče + name: Pozvat hráče description: | - Hráči musí být v - stejný svět jako ty - Zobrazeno v seznamu. + Hráči musí být ve + stejném světě jako ty, + aby se zobrazili v seznamu. tips: LEFT: - name: 'Kliknutí na levé straně' + name: 'Levý klik' invite: 'pozvat hráče' RIGHT: - name: 'Kliknutí pravým tlačítkem' + name: 'Pravý klik' SHIFT_RIGHT: - name: 'Posuňte kliknutím pravým tlačítkem' + name: 'Shift + pravý klik' reject: 'odmítnout' - kick: 'kopat hráče' + kick: 'vyhodit hráče' leave: 'opustit tým' SHIFT_LEFT: - name: 'Posuňte kliknutí doleva' + name: 'Shift + levý klik' accept: 'přijmout' setowner: | nastavit vlastníka @@ -840,7 +840,7 @@ commands: to-accept-or-reject: >- Proveď /[label] team accept k přijetí žádosti, nebo /[label] team reject k odmítnutí - you-will-lose-your-island: 'VAROVÁNÍ! Ztatíš svůj ostrov, když žádost přijmeš!' + you-will-lose-your-island: 'VAROVÁNÍ! Ztratíš svůj ostrov, když žádost přijmeš!' gui: titles: team-invite-panel: Pozvěte hráče @@ -853,17 +853,17 @@ commands: enter-name: 'Zadejte název:' tips: LEFT: - name: 'Kliknutí na levé straně' + name: 'Levý klik' search: 'Zadejte jméno hráče' - back: 'Zadní' + back: 'Zpět' invite: | pozvat hráče připojit se ke svému týmu RIGHT: - name: 'Kliknutí pravým tlačítkem' - coop: 'coop hráči' + name: 'Pravý klik' + coop: 'kooperovat s hráčem' SHIFT_LEFT: - name: 'Posuňte kliknutí doleva' + name: 'Shift + levý klik' trust: 'důvěřovat hráči' errors: cannot-invite-self: 'Nemůžeš pozvat sám sebe!' @@ -901,7 +901,7 @@ commands: kick: description: odstranit člena tvého ostrova parameters: - player-kicked: '[name] vás vykoplo z ostrova v [gamemode]!' + player-kicked: '[name] tě vykopl z ostrova v [gamemode]!' cannot-kick: 'Nemůžeš vykopnout sám sebe!' cannot-kick-rank: 'Vaše hodnost nedovoluje kopnout [name]!' success: '[name] byl vykopnut z tvého ostrova.' @@ -918,7 +918,7 @@ commands: description: povýšit hráče na tvém ostrově parameters: errors: - cant-promote-yourself: 'Nemůžete se propagovat!' + cant-promote-yourself: 'Nemůžeš povýšit sám sebe!' cant-promote: 'Nemůžete povýšit nad svou hodnost!' must-be-member: 'Hráč musí být [prefix_an-island] člen!' failure: 'Hráče již nelze nadále povýšit!' @@ -999,11 +999,11 @@ protection: description: Povolit dávání a odebírání předmětů do/z Allay a Copper Golem hint: Interakce Allay a Copper Golem zakázána ANIMAL_NATURAL_SPAWN: - description: Přepnout přirozené tření zvířat - name: Přírodní potěr zvířat + description: Přepnout přirozené spawnování zvířat + name: Přirozené spawnování zvířat ANIMAL_SPAWNERS_SPAWN: - description: Přepínat tření zvířat pomocí jiker - name: Živočišní jikry + description: Přepnout spawnování zvířat pomocí spawnerů + name: Spawnery zvířat ANVIL: description: Přepnout interakce name: Kovadliny @@ -1022,8 +1022,8 @@ protection: hint: Použití majáku zakázáno BELL_RINGING: description: Přepínač interakce - name: Nechte zvonit zvonění - hint: Bell Ringing Deaktived + name: Zvonění zvonů + hint: Zvonění zakázáno BED: description: Přepnout interakce name: Postele @@ -1047,7 +1047,7 @@ protection: Přepnout spawners lámání. Přepíše příznak Break Blocks. name: Rozbít spawnery - hint: Rozbití potěru zakázáno + hint: Rozbití spawnerů zakázáno BREAK_HOPPERS: description: |- Rozbití násypek. @@ -1093,20 +1093,20 @@ protection: vlastními vlaječkami. hint: Přístup do kontejnerů zakázán CHEST: - name: Truhly a truhly s minecart + name: Truhly a vozíky s truhlou description: |- Přepínání interakce s truhlami - a hrudní minové vozíky. - (nezahrnuje uvězněné truhly) - hint: Přístup na hruď zakázán + a vozíky s truhlou. + (nezahrnuje pastičkové truhly) + hint: Přístup k truhlám zakázán BARREL: name: Sudy description: Přepnout interakci sudu hint: Přístup do sudu zakázán CRAFTER: name: Crafter - description: Přepínač - hint: Crafter Access deaktivovaný + description: Přepnout použití + hint: Přístup ke Crafteru zakázán BLOCK_EXPLODE_DAMAGE: description: |- Povolit kotvy Bed & Respawn @@ -1135,7 +1135,7 @@ protection: hint: Přístup ke schránce Shulker zakázán SHULKER_TELEPORT: description: |- - & Shulker se může teleportovat + Shulker se může teleportovat pokud je aktivní. name: Shulker Teleport SMITHING: @@ -1147,15 +1147,15 @@ protection: description: Přepnout použití hint: Přístup ke kamenictví zakázán TRAPPED_CHEST: - name: Uvězněné truhly - description: Přepnout interakci se zachyceným hrudníkem - hint: Zablokovaný přístup k hrudi je zakázán + name: Pastičkové truhly + description: Přepnout interakci s pastičkovými truhlami + hint: Přístup k pastičkovým truhlám zakázán DISPENSER: name: Dávkovače description: Přepnout interakce dávkovače hint: Interakce dávkovače zakázána DROPPER: - name: Povadače + name: Podavače description: Přepnout interakce podavače hint: Interakce podavače zakázána ELYTRA: @@ -1201,9 +1201,9 @@ protection: COLLECT_POWDERED_SNOW: description: |- Přepnout sběr prachového sněhu - (přepsat segmenty) - name: Sbírejte prachový sníh - hint: Vyřazeny lopaty na prachový sníh + (přepisuje Kbelíky) + name: Sběr prachového sněhu + hint: Sběr prachového sněhu zakázán COMMAND_RANKS: name: 'Hodnosti příkazů' description: 'Konfigurovat hodnosti příkazů' @@ -1225,7 +1225,7 @@ protection: CROP_TRAMPLE: description: Přepnout ničení plodin name: Ničení plodin - hint: Ničení podin zakázáno + hint: Ničení plodin zakázáno DOOR: description: Přepnout použití dvěří name: Použití dveří @@ -1283,7 +1283,7 @@ protection: now-leaving: 'Právě odcházíš od [name].' now-leaving-your-island: 'Právě odcházíš ze svého ostrova: [name]' EXPERIENCE_BOTTLE_THROWING: - name: Házení zkošenostními lahvičkami + name: Házení zkušenostními lahvičkami description: Přepnout házení zkušenostními lahvičkami. hint: Zkušenostní lahvičky zakázány FIRE_BURNING: @@ -1332,8 +1332,8 @@ protection: HARVEST: description: |- Nastavte, kdo může sklízet plodiny. - Nezapomeňte položku povolit - & také vyzvednutí! + Nezapomeňte povolit + také sběr předmětů! name: Sklizeň plodin hint: Sklizeň plodin zakázána HIVE: @@ -1342,10 +1342,10 @@ protection: hint: Sklizeň zakázána HURT_TAMED_ANIMALS: description: >- - Toggle bolí. Povoleno znamená, že zkroucená zvířata mohou poškodit. - Zakázáno znamená, že jsou neporazitelné. - name: Zraněné zkrocené zvířata - hint: Zkromané zvíře bolí deaktivované + Přepnout zranitelnost. Povoleno znamená, že ochočená zvířata mohou být zraněna. + Zakázáno znamená, že jsou nezranitelná. + name: Ubližovat ochočeným zvířatům + hint: Ubližování ochočeným zvířatům zakázáno HURT_ANIMALS: description: Přepnout ubližování name: Ubližovat zvířatům @@ -1398,7 +1398,7 @@ protection: LEASH: description: Přepnout použití name: Použití vodítka - hint: Vodítko používat deaktivované + hint: Použití vodítka zakázáno LECTERN: name: Čtecí pulty description: |- @@ -1410,15 +1410,15 @@ protection: LEVER: description: Přepnout použití name: Použití páčky - hint: Piužití páčky zakázáno + hint: Použití páčky zakázáno LIMIT_MOBS: description: |- - Omezit entity od - a spawnování v této hře - režim. + Omezit spawnování entit + v tomto herním + režimu. name: 'Omezte spawnování typu entity' - can: 'Může se plodit' - cannot: 'Nelze spustit' + can: 'Může se spawnovat' + cannot: 'Nemůže se spawnovat' LIQUIDS_FLOWING_OUT: name: Přetékání kapalin mimo ostrov description: |- @@ -1437,8 +1437,8 @@ protection: CHANGE_SETTINGS: name: Změnit nastavení description: |- - Povolit přepnutí kterého člena - ole může změnit nastavení ostrova. + Povolit přepnutí, která + role může změnit nastavení ostrova. MILKING: description: Přepnout dojení krav name: Dojení @@ -1448,11 +1448,11 @@ protection: description: Přepnout interakce s vozíky hint: Interakce s vozíky zakázány MONSTER_NATURAL_SPAWN: - description: Přepnout přirozené tření monster - name: Přirozený potěr monster + description: Přepnout přirozené spawnování monster + name: Přirozené spawnování monster MONSTER_SPAWNERS_SPAWN: - description: Přepněte tření monster pomocí spawnerů - name: Spawnři monster + description: Přepnout spawnování monster pomocí spawnerů + name: Spawnery monster MOUNT_INVENTORY: description: |- Přepnout přístup @@ -1495,18 +1495,18 @@ protection: name: Offline růst OFFLINE_REDSTONE: description: |- - Je-li zakázáno, rudit + Je-li zakázáno, redstone nebude funkční na ostrovech, jejichž členové jsou všichni offline. Může pomoci snížit lagy. Neplatí pro spawn ostrov. - name: Offline Rudit + name: Offline Redstone PETS_STAY_AT_HOME: description: |- Když je aktivní, ochočená zvířata - může jít pouze do a - nemůže opustit vlastníka - & domovský ostrov. + mohou být pouze na + domovském ostrově vlastníka + a nemohou ho opustit. name: Domácí mazlíčci zůstávají doma PISTON_PUSH: description: |- @@ -1575,8 +1575,8 @@ protection: disabled: 'PVP v Overworldu bylo zakázáno.' REDSTONE: description: Přepnout použití - name: Ruditové předměty - hint: Interakce s ruditem zakázány + name: Redstone předměty + hint: Interakce s redstone zakázány REMOVE_END_EXIT_ISLAND: description: |- Zabraňuje vytváření výstupního @@ -1614,16 +1614,16 @@ protection: hint: aktivace senzoru sculku je zakázána SCULK_SHRIEKER: description: |- - Přepíná sculk křičel - aktivace. + Přepíná aktivaci + sculk shriekeru. name: Sculk Shrieker hint: Sculk Shrieker aktivace je zakázána SIGN_EDITING: description: |- Umožňuje úpravy textu - znaků - name: Editace znamení - hint: editace znaku je zakázána + na cedulích + name: Editace cedulí + hint: Editace cedulí je zakázána TNT_DAMAGE: description: |- Povolit TNT a TNT vozíkům @@ -1672,21 +1672,21 @@ protection: pokud padají. hint: 'Nemůžeš toto provést, když padáš.' VISITOR_KEEP_INVENTORY: - name: Návštěvníci vedou inventář na smrt + name: Návštěvníci si ponechají inventář po smrti description: |- - Zabraňte hráčům, aby ztratili své - & předměty a zkušenosti, pokud zemřou - ostrov, na kterém jsou návštěvníci. + Zabraňuje hráčům ztratit své + předměty a zkušenosti, pokud zemřou + na ostrově, kde jsou návštěvníky. - Členové Island stále ztrácejí své předměty + Členové ostrova stále ztrácejí své předměty, pokud zemřou na svém vlastním ostrově! SPAWN_PROTECTION: - name: Spawn island void protection + name: Ochrana spawn ostrova před prázdnotou description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Když je aktivní, hráči, kteří spadnou + do prázdnoty na spawn ostrově, + budou teleportováni zpět na + spawn místo namísto smrti. RAID_TRIGGER: name: Spuštění nájezdu description: Nastavuje minimální rank ostrova potřebný ke spuštění nájezdu @@ -1694,9 +1694,9 @@ protection: ENTITY_PORTAL_TELEPORT: name: Použití portálu entity description: |- - Přepíná, pokud mohou entity (nehráče). - pomocí portálů se mezi nimi teleportovat - rozměry + Přepíná, zda se mohou entity (ne hráči) + teleportovat pomocí portálů + mezi dimenzemi. WIND_CHARGE: name: Větrný výboj description: |- @@ -1770,55 +1770,55 @@ protection: command-instructions: setname: | Vyberte hodnost, která může - Nastavte název + nastavit název ban: | Vyberte hodnost, která může - zakázat hráči + zakázat přístup hráči unban: | Vyberte hodnost, která může - Unban hráči + povolit přístup hráči expel: | Vyberte hodnost, která může - Vyloučit návštěvníci + vykázat návštěvníky team-invite: | Vyberte hodnost, která může pozvat team-kick: | Vyberte hodnost, která může - kop + vykopnout hráče team-coop: | Vyberte hodnost, která může - coop + kooperovat team-trust: | Vyberte hodnost, která může - důvěra + důvěřovat team-uncoop: | Vyberte hodnost, která může - nekoop + zrušit kooperaci team-untrust: | Vyberte hodnost, která může - nedůvěra + zrušit důvěru team-promote: | Vyberte hodnost, která může - Propagujte hodnost hráče + povýšit hodnost hráče team-demote: | Vyberte hodnost, která může - Demote pozice hráče + degradovat hodnost hráče sethome: | Vyberte hodnost, která může - vNastavit domy + nastavit domy deletehome: | Vyberte hodnost, která může smazat domy renamehome: | Vyberte hodnost, která může - Přejmenování domů + přejmenovat domy setcount: | Vyberte hodnost, která může změnit fázi border: | Vyberte hodnost, která může - Použijte příkaz Border + použít příkaz Border description-layout: | [description] @@ -1943,34 +1943,34 @@ catalog: enums: DamageCause: CONTACT: Kontakt - ENTITY_ATTACK: Útok davů - ENTITY_SWEEP_ATTACK: Útok zametání + ENTITY_ATTACK: Útok entity + ENTITY_SWEEP_ATTACK: Plošný útok PROJECTILE: Projektil SUFFOCATION: Udušení - FALL: Podzim - FIRE: oheň - FIRE_TICK: Hořící + FALL: Pád + FIRE: Oheň + FIRE_TICK: Hoření MELTING: Tání LAVA: Láva - DROWNING: Topit se + DROWNING: Utopení BLOCK_EXPLOSION: Bloková exploze ENTITY_EXPLOSION: Exploze entity - VOID: Neplatné + VOID: Prázdnota LIGHTNING: Blesk SUICIDE: Sebevražda STARVATION: Hladovění POISON: Jed MAGIC: Kouzlo - WITHER: vadnout + WITHER: Wither FALLING_BLOCK: Padající blok THORNS: Trny DRAGON_BREATH: Dračí dech - CUSTOM: Zvyk - FLY_INTO_WALL: Letět do zdi + CUSTOM: Vlastní + FLY_INTO_WALL: Náraz do zdi HOT_FLOOR: Horká podlaha CRAMMING: Napěchování - DRYOUT: Vyschnout - FREEZE: Zmrazit + DRYOUT: Vyschnutí + FREEZE: Zmrznutí KILL: Zabít SONIC_BOOM: Sonic Boom WORLD_BORDER: Světová hranice From 6eaeea98adb8736d60848a365f15ae2c82975f7f Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 20:50:57 -0700 Subject: [PATCH 07/95] Fix German (de.yml) locale: correct mistranslations, typos, broken tags, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes untranslated English in maxsize and SPAWN_PROTECTION sections, nonsensical words (Firch, Unglaner, blauprint), broken legacy color codes, du/Sie inconsistency, duplicated PETS_STAY_AT_HOME text in VISITOR_KEEP_INVENTORY, wrong translations (Lösung/Spülen/Blockieren Sie), and rewrites all garbled command-instruction entries. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/de.yml | 162 +++++++++++++++--------------- 1 file changed, 79 insertions(+), 83 deletions(-) diff --git a/src/main/resources/locales/de.yml b/src/main/resources/locales/de.yml index 9b3ae17c8..a859aee8f 100644 --- a/src/main/resources/locales/de.yml +++ b/src/main/resources/locales/de.yml @@ -74,7 +74,7 @@ commands: unknown-island: Unbekannt [prefix_island]! [name] resethome: description: Setzen Sie das Haus des Spielers auf Standard zurück - parameters: [[prefix_island] Name] + parameters: [[prefix_island] Name] cleared: 'Hausrücksetzen. [name]' resets: description: Resets der Spieler bearbeiten @@ -120,18 +120,18 @@ commands: Scanning -Inseln in der Datenbank. Dies kann eine Weile dauern, je nachdem, wie viele Sie haben ... scanning-in-progress: 'In Arbeit scannen, bitte warten Sie' - none-found: 'Keine Inseln, um zu reinigen.' - total-islands: 'Sie haben [number] Islands in Ihrer Datenbank in allen Welten.' + none-found: 'Keine zu löschenden Inseln gefunden.' + total-islands: 'Du hast [number] Inseln in deiner Datenbank über alle Welten.' number-error: 'Eingabe muss eine Anzahl von Tagen sein' confirm: 'Tippe /[label] purge confirm zum Starten des Löschvorgangs ein' - completed: 'Lösung gestoppt' + completed: 'Löschung gestoppt' see-console-for-status: Löschung gestartet. Für den Status siehe Konsole no-purge-in-progress: 'Derzeit wird keine Löschung durchgeführt.' regions: parameters: '[days]' description: Säuberinseln durch Löschen alter Regionendateien confirm: >- - Typ /[label] purge regions confirm , um mit dem Spülen zu + Tippe /[label] purge regions confirm , um mit dem Löschen zu beginnen protect: description: Umschalten des Insellöschschutzes @@ -198,10 +198,10 @@ commands: mehr als durch die Einstellungen oder Berechtigungen erlaubt ist: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Maximale Teamgröße für die [prefix_island] eines Spielers festlegen (0 für Weltstandardwert) + success: 'Maximale Teamgröße von [name]s [prefix_island] auf [number] gesetzt.' + reset: 'Maximale Teamgröße von [name]s [prefix_island] auf den Weltstandardwert zurückgesetzt ([number]).' range: description: Admin Insel Bereichsbefehl invalid-value: @@ -221,7 +221,7 @@ commands: Graue Partikelzeigen die maximale Inselgrenze an. - Grüne Partikelzeigen den voreingestellten Schutzbereich an, wenn + Grüne Partikel zeigen den voreingestellten Schutzbereich an, wenn der Inselschutzbereich davon abweicht. showing: 'Inselbegrenzungen eingeblendet' set: @@ -231,7 +231,7 @@ commands: reset: parameters: description: Setzt den inselgeschützten Bereich auf den Weltstandard zurück - success: '& a Setzt den Inselschutzbereich auf & b [number] & a zurück.' + success: 'Inselschutzbereich auf [number] zurückgesetzt.' add: description: Erhöht den Schutzbereich der Insel parameters: [Inselstandort] @@ -264,7 +264,7 @@ commands: unregistered-island: 'Unregistrierter Spieler von der Insel bei [xyz].' errors: unknown-island-location: 'Unbekannter Inselstandort' - specify-island-location: 'Gib denn Inselstandort in x,y,z Format an' + specify-island-location: 'Gib den Inselstandort im x,y,z Format an' player-has-more-than-one-island: 'Spieler hat mehr als eine Insel. Gib an welche.' info: parameters: @@ -334,7 +334,7 @@ commands: version: description: BentoBox und Addon-Versionen anzeigen setrange: - parameters: + parameters: description: Die Reichweite der Spielerinsel festlegen range-updated: 'Inselbereich aktualisiert auf [number].' placeholders: @@ -374,7 +374,7 @@ commands: island: 'Dies betrifft die Insel in [xyz], die ''[name]'' gehört.' confirmation: 'Möchtest du [xyz] wirklich als Schutzzentrum festlegen?' success: '[xyz] erfolgreich als Schutzzentrum festgelegt.' - fail: 'Fehler beim Festlegen von [xyz] als Schutzzentrum.' + fail: 'Fehler beim Festlegen von [xyz] als Schutzzentrum.' island-location-changed: '[user] hat das Schutzzentrum der Insel in [xyz] geändert.' xyz-error: 'Geben Sie drei ganzzahlige Koordinaten an: z. B. 100 120 100' setspawn: @@ -582,17 +582,17 @@ commands: success: 'Erfolgreiches Zurücksetzen von [name]''s Toden auf 0.' set: description: Legt die Tode des Spielers fest - parameters: + parameters: success: 'Erfolgreiche Einstellung von [name]''s Toden auf [number].' add: description: Fügt dem Spieler Tode hinzu - parameters: + parameters: success: >- Es wurde[number]Tode zu [name] hinzugefügt, wodurch sich die Gesamtzahl auf[total]Tode erhöht. remove: description: Entfernt Tode von dem Spieler - parameters: + parameters: success: >- Es wurden[number]Tode von [name] entfernt, wodurch sich die Gesamtzahl auf[total]Tode verringert hat. @@ -697,7 +697,7 @@ commands: description: >- Erstellt eine Insel, mit Hilfe einer optionalen Blaupause (erfordert Permission) - parameters: + parameters: too-many-islands: >- Es gibt zu viele Inseln auf dieser Welt: es gibt nicht genug Platz, um deine zu erstellen. @@ -746,7 +746,7 @@ commands: no-neighbors: 'Du hast keine unmittelbaren Nachbarinseln!' reset: description: Startet deine Insel neu und entfernt die alte - parameters: + parameters: none-left: 'Du hast keine Resets mehr übrig!' resets-left: 'Du hast[number]Resets übrig' confirmation: >- @@ -791,7 +791,7 @@ commands: already-exists: 'Dieser Name existiert bereits, versuche es mit einem anderen Namen.' resetname: description: Setze deinen Inselnamen zurück - success: 'Setzen Sie Ihren Inselnamen erfolgreich zurück.' + success: 'Dein Inselname wurde erfolgreich zurückgesetzt.' team: description: Dein Team verwalten gui: @@ -901,7 +901,7 @@ commands: reject um abzulehnen you-will-lose-your-island: | WARNUNG! Du verlierst alle - Inseln, wenn Sie akzeptieren! + Inseln, wenn du akzeptierst! gui: titles: team-invite-panel: Spieler einladen @@ -965,7 +965,7 @@ commands: kick: description: Entferne ein Mitglied von deiner Insel parameters: - player-kicked: 'Der [name] hat dich im [gamemode] von der Insel geworfen!' + player-kicked: '[name] hat dich im [gamemode] von der Insel geworfen!' cannot-kick: 'Du kannst dich nicht selbst kicken!' cannot-kick-rank: 'Dein Rang erlaubt es nicht, [name] zu kicken!' success: '[name]wurde von deiner Insel gekickt.' @@ -993,7 +993,7 @@ commands: cant-transfer-to-yourself: >- Du kannst dir das Eigentum nicht selbst übertragen! (Tja, eigentlich könntest du... Aber wir wollen nicht, dass du es tust. - Weil es sinnlos ist.& ) + Weil es sinnlos ist.) target-is-not-member: 'Dieser Spieler gehört nicht zu deinem Inselteam!' at-max: >- Dieser Spieler hat bereits die maximal zulässige Anzahl an @@ -1067,7 +1067,7 @@ protection: hint: Allay & Copper Golem Interaktion deaktiviert ANIMAL_NATURAL_SPAWN: description: Natürliches Spawnen von Tieren umschalten - name: Tier + name: Natürliches Tier-Spawnen ANIMAL_SPAWNERS_SPAWN: description: Schaltet das Spawnen von Tieren mit Spawnern um name: Tierspawner @@ -1078,7 +1078,7 @@ protection: ARMOR_STAND: description: Interaktion umschalten name: Rüstungsständer - hint: Rüstungsständnutzung deaktiviert + hint: Rüstungsständernutzung deaktiviert AXOLOTL_SCOOPING: name: Axolotl beim Schöpfen description: Lassen Sie Axolotl mit einem Eimer schöpfen @@ -1179,7 +1179,7 @@ protection: Bett- und Respawn-Anker zulassen , um Blöcke zu zerstören und zu beschädigen Entitäten. - name: Blockieren Sie Explosionsschaden + name: Block-Explosionsschaden COMPOSTER: name: Komposter description: Komposter-Interaktion umschalten @@ -1272,8 +1272,8 @@ protection: name: Pulverschnee sammeln hint: Pulverschneesammeln deaktiviert COMMAND_RANKS: - name: 'Befehlsreihenfolge' - description: 'Befehlsreihenfolge konfigurieren' + name: 'Befehlsränge' + description: 'Befehlsränge konfigurieren' CRAFTING: description: Umschalten der Nutzung name: Werkbänke @@ -1363,7 +1363,7 @@ protection: name: Feuerlöschen hint: Feuerlöschung deaktiviert FIRE_IGNITE: - name: Die Feuerzündung + name: Feuerzündung description: |- Umschalten, ob das Feuer mit Nicht-Spieler-Mitteln entzündet werden kann oder nicht. @@ -1399,8 +1399,8 @@ protection: HARVEST: description: |- Legt fest, wer Getreide ernten kann. - Vergiss nicht, das Item aufsammeln auch zuzulassen - zuzulassen! + Vergiss nicht, das Item-Aufsammeln + auch zuzulassen! name: Ernte hint: Ernte deaktiviert HIVE: @@ -1413,7 +1413,7 @@ protection: Schaden nehmen können. Deaktiviert bedeutet, dass sie nicht verletzt werden können. name: Verletze gezähmte Tiere - hint: Gezähmtes Tier verletzen deaktivert + hint: Gezähmte Tiere verletzen deaktiviert HURT_ANIMALS: description: Umschalten des Verletzens name: Tiere verletzen @@ -1608,8 +1608,8 @@ protection: hint: Netherportalnutzung deaktiviert END_PORTAL: description: Umschalten der Nutzung - name: Ende Portal - hint: Endportalnutzung deaktiviert + name: End-Portal + hint: End-Portal-Nutzung deaktiviert PAUSE_MOB_GROWTH: name: Mob-Wachstum pausieren description: |- @@ -1643,8 +1643,8 @@ protection: auf der Insel. name: Oberwelt PVP hint: 'PVP in der Oberwelt deaktiviert' - enabled: 'Der PVP in der Oberwelt wurde aktiviert.' - disabled: 'Der PVP in der Oberwelt wurde deaktiviert.' + enabled: 'Das PVP in der Oberwelt wurde aktiviert.' + disabled: 'Das PVP in der Oberwelt wurde deaktiviert.' REDSTONE: description: Umschalten der Nutzung name: Redstone Items @@ -1749,26 +1749,22 @@ protection: VISITOR_KEEP_INVENTORY: name: Besucher behalten ihr Inventar beim Tod description: |- - Verhindern Sie, dass Spieler ihre + Verhindert, dass Spieler ihre Gegenstände und Erfahrungen verlieren, wenn sie auf einer Insel - sterben, auf der sie ein Besucher + sterben, auf der sie Besucher sind. - Inselmitglieder verlieren immer - noch ihre Gegenstände, wenn sie + Inselmitglieder verlieren weiterhin + ihre Gegenstände, wenn sie auf ihrer eigenen Insel sterben! - Wenn sie aktiv sind, können - gezähmte Haustiere nur auf die - Heimatinsel des Besitzers gehen - und sie nicht verlassen. SPAWN_PROTECTION: - name: Spawn island void protection + name: Spawn-Insel Void-Schutz description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Wenn aktiviert, werden Spieler, die + auf der Spawn-Insel in die Leere fallen, + zum Spawnpunkt zurückteleportiert, + anstatt zu sterben. RAID_TRIGGER: name: Raid auslösen description: Legt den minimalen Inselrang fest, der zum Auslösen eines Raids benötigt wird @@ -1851,56 +1847,56 @@ protection: name-layout: '[name]' command-instructions: setname: | - Wählen Sie den Rang, der kann - Setzen Sie den Namen + Wähle den Rang, der + den Namen setzen darf ban: | - Wählen Sie den Rang, der kann - Spieler verbieten + Wähle den Rang, der + Spieler bannen darf unban: | - Wählen Sie den Rang, der kann - Unglaner Spieler + Wähle den Rang, der + Spieler entbannen darf expel: | - Wählen Sie den Rang, der kann - Besucher vertreiben + Wähle den Rang, der + Besucher vertreiben darf team-invite: | - Wählen Sie den Rang, der kann - einladen + Wähle den Rang, der + einladen darf team-kick: | - Wählen Sie den Rang, der kann - Kick + Wähle den Rang, der + kicken darf team-coop: | - Wählen Sie den Rang, der kann - Koop + Wähle den Rang, der + kooperieren darf team-trust: | - Wählen Sie den Rang, der kann - Vertrauen + Wähle den Rang, der + vertrauen darf team-uncoop: | - Wählen Sie den Rang, der kann - Entkoppeln + Wähle den Rang, der + Kooperation beenden darf team-untrust: | - Wählen Sie den Rang, der kann - nicht vertrauen + Wähle den Rang, der + Vertrauen entziehen darf team-promote: | - Wählen Sie den Rang, der kann - Fördern Sie den Rang des Spielers + Wähle den Rang, der + Spieler befördern darf team-demote: | - Wählen Sie den Rang, der kann - herabstufen der Rang des Spielers + Wähle den Rang, der + Spieler herabstufen darf sethome: | - Wählen Sie den Rang, der kann - Häuser einstellen + Wähle den Rang, der + Häuser setzen darf deletehome: | - Wählen Sie den Rang, der kann - vHäuser löschen + Wähle den Rang, der + Häuser löschen darf renamehome: | - Wählen Sie den Rang, der kann - Häuser umbenennen + Wähle den Rang, der + Häuser umbenennen darf setcount: | - Wählen Sie den Rang, der kann - Ändern Sie die Phase + Wähle den Rang, der + die Phase ändern darf border: | - Wählen Sie den Rang, der kann - Verwenden Sie den Grenzbefehl + Wähle den Rang, der + den Border-Befehl nutzen darf description-layout: |- [description] From 86d379efac00d9f772de5fa45c49e1870781ef27 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 20:59:32 -0700 Subject: [PATCH 08/95] Fix Spanish (es.yml) locale: correct mistranslations, typos, broken tags, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes untranslated English in maxsize, SPAWN_PROTECTION, and UI strings, wrong translations (cerveza/beer for brewing stand, Pañuelo/handkerchief for Crafter, Compuertas/floodgates for Composter, coral for Chorus, invisibles for invencibles), broken legacy color codes, typos throughout, an AI response left in conversation-prefix, and translated placeholders that should remain as English tokens. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/es.yml | 148 +++++++++++++++--------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/main/resources/locales/es.yml b/src/main/resources/locales/es.yml index 58503ee6c..29a407b73 100644 --- a/src/main/resources/locales/es.yml +++ b/src/main/resources/locales/es.yml @@ -27,8 +27,8 @@ general: player-has-no-island: 'Ese jugador no tiene una isla!' already-have-island: 'Ya tienes una isla!' no-safe-location-found: >- - No se pudo encontrar un lugar seguro para teletransportarlo a usted en - el éxito de la isla. + No se pudo encontrar un lugar seguro para teletransportarte en + la isla. not-owner: 'No eres el dueño de tu isla!' player-is-not-owner: '[name] no es dueño de una isla!' not-in-team: 'Ese jugador no está en tu equipo!' @@ -47,7 +47,7 @@ general: the-end: El Fin commands: help: - header: '=========== cBentoBox ===========' + header: '=========== [label] ayuda ===========' syntax: '[usage] [parameters]: [description]' syntax-no-parameters: '[usage]: [description]' end: '=================================' @@ -82,7 +82,7 @@ commands: description: Restablece los reinicios de este jugador a 0 parameters: success-everyone: 'Restablecer con éxito restablece a todos a 0 .' - success: 'Restablecer con éxito & b [name] 0 .' + success: 'Reiniciados con éxito los reinicios de [name] a 0.' add: description: se suma a cuántas veces este jugador reinició su isla parameters: @@ -110,14 +110,14 @@ commands: config.yml de BentoBox. Luego ejecuta un purge. - purge-in-progress: 'Purgaen progreso. Use la parada de purga para cancelar' + purge-in-progress: 'Purga en progreso. Usa purge stop para cancelar' scanning: >- Escaneando islas en la base de datos. Esto puede tardar un tiempo dependiendo de cuántas tengas... scanning-in-progress: 'Escaneando en progreso, por favor espera' none-found: 'No se encontraron islas para purgar.' total-islands: 'Tienes [number] islas en tu base de datos en todos los mundos.' - number-error: 'El argumento debe ser varios días' + number-error: 'El argumento debe ser un número de días' confirm: 'Escribe [label] purga confirmar para iniciar la purga' completed: 'La purga se detuvo' see-console-for-status: La purga comenzó. Ver consola para el estado @@ -129,7 +129,7 @@ commands: protect: description: Activar protección de purga de isla move-to-island: '¡Muévete primero a una isla!' - protecting: 'Remover isla protegida' + protecting: 'Isla protegida contra purga' unprotecting: 'Eliminación de la protección de purga' stop: description: Detener una purga en progreso @@ -140,7 +140,7 @@ commands: status: description: muestra el estado de la purga status: >- - [purged] islas purgadas de [purgeable] & 7 (& b [percentage] + [purged] islas purgadas de [purgeable] ([percentage] %). team: description: gestionar equipos @@ -186,10 +186,10 @@ commands: Advertencia: este jugador ahora posee [number] islas. Esto es más de lo permitido por la configuración o permisos: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Establecer el tamaño máximo de equipo para la [prefix_island] de un jugador (usa 0 para restablecer al valor predeterminado del mundo) + success: 'Tamaño máximo de equipo de [name] en [prefix_island] establecido a [number].' + reset: 'Tamaño máximo de equipo de [name] en [prefix_island] restablecido al valor predeterminado del mundo ([number]).' range: description: Comando de rango de la isla de administración invalid-value: @@ -258,7 +258,7 @@ commands: parameters: description: Obtén información sobre dónde estás o la isla del jugador. no-island: 'No estás en una isla en este momento...' - title: '========== Island Info ============' + title: '========== Info de la Isla ============' island-uuid: 'UUID: [uuid]' owner: 'Propietario: [owner] ([uuid])' last-login: 'Último acceso: [date]' @@ -274,15 +274,15 @@ commands: max-trusted-size: 'Tamaño máximo de confianza: [number]' island-protection-center: 'Centro del área de protección: [xyz]' island-center: '[prefix_Island] centro: [xyz]' - island-coords: 'Coordenadas de la isla: [xz1] to [xz2]' + island-coords: 'Coordenadas de la isla: [xz1] a [xz2]' islands-in-trash: 'El jugador tiene islas en la basura.' protection-range: 'Rango de protección: [range]' protection-range-bonus-title: 'Incluye estos bonificaciones:' protection-range-bonus: 'Bonificación: [number]' purge-protected: La isla está protegida por purga max-protection-range: 'El mayor rango de protección histórica: [range]' - protection-coords: 'Coordenadas de proteccion: [xz1] to [xz2]' - is-spawn: La isla es una isla engendrada. + protection-coords: 'Coordenadas de protección: [xz1] a [xz2]' + is-spawn: La isla es el spawn banned-players: 'Jugadores prohibidos:' banned-format: '[name]' unowned: 'Sin propietario' @@ -305,7 +305,7 @@ commands: no-islands-in-trash: 'El jugador no tiene islas en la basura' parameters: '[player]' description: Mostrar islas sin propietarios o islas de jugadores en la basura - title: '=========== Islands in Trash ===========' + title: '=========== Islas en la Basura ===========' count: 'Isla [number]:' use-switch: >- Usa [label] switchto para cambiar el jugador a @@ -316,7 +316,7 @@ commands: emptytrash: parameters: '[player]' description: Borrar basura para el jugador, o todas las islas sin dueño en la basura - success: 'Trash se vació con éxito.' + success: 'La basura se vació con éxito.' version: description: Mostrar versiones de BentoBox y complementos setrange: @@ -361,7 +361,7 @@ commands: protección? success: 'Se ha establecido correctamente [xyz] como el centro de protección.' fail: 'Falló al establecer [xyz] como el centro de protección.' - island-location-changed: '[usuario] cambió el centro de protección de [prefijo_isla] a [xyz].' + island-location-changed: '[user] cambió el centro de protección de [prefix_island] a [xyz].' xyz-error: 'Especifica tres coordenadas enteras: p.ej, 100 120 100' setspawn: description: 'Establecer una isla como spawn para este mundo ' @@ -370,7 +370,7 @@ commands: confirmation: >- Estás seguro de que quieres establecer esta isla como el spawn de este mundo? - success: 'Con éxito establece esta isla como el engendro de este mundo.' + success: 'Esta isla se ha establecido con éxito como el spawn de este mundo.' setspawnpoint: description: establecer la ubicación actual como punto de generación para esta isla no-island-here: 'No hay isla aquí.' @@ -426,8 +426,8 @@ commands: no-blueprint: '[name] no existe.' confirmation: | ¿Está seguro de que desea eliminar este plano? - c Una vez eliminado, no hay forma de recuperarlo. - success: 'Borrado exitosamente el plano & b [name] .' + Una vez eliminado, no hay forma de recuperarlo. + success: 'Borrado exitosamente el plano [name].' load: parameters: description: Cargar esquema en el portapapeles @@ -451,7 +451,7 @@ commands: parameters: description: renombrar un plano success: >- - Blueprint & b [old] & a ha sido renombrado con éxito a [name] + El plano [old] ha sido renombrado con éxito a [name] . pick-different-name: >- Especifique un nombre que sea diferente del nombre actual del @@ -491,7 +491,7 @@ commands: Se eliminaron algunos caracteres porque no están permitidos. La nueva ID será [name]. success: ¡Éxito! - conversation-prefix: Sure! Please provide the text you'd like me to translate. + conversation-prefix: '>' description: quit: dejar instructions: |- @@ -502,8 +502,8 @@ commands: cancelling: Cancelado slot: 'Ranura preferida [number]' slot-instructions: |- - Haga clic para aumentar - Haga clic para disminuir + Clic izquierdo para aumentar + Clic derecho para disminuir times: |- Máx. usos concurrentes por jugador Clic izquierdo para incrementar @@ -568,7 +568,7 @@ commands: reset: description: Reinicia las muertes del jugador. parameters: - success: 'Reinciciadas con exito las muertes de [name]a 0.' + success: 'Reiniciadas con éxito las muertes de [name] a 0.' set: description: establece las muertes del jugador parameters: @@ -583,7 +583,7 @@ commands: description: elimina muertes al jugador parameters: success: >- - Eliminado exitosamente [number] demuertes a [name], + Eliminadas exitosamente [number] de muertes a [name], disminuyendo el total a [total] de muertes. resetname: description: reiniciar jugador [prefix_island] nombre @@ -627,7 +627,7 @@ commands: addon-syntax: '[name] [version] ([state])' game-world: '[name] ([addon]): Mundo, Nether, End' server: 'Corriendo [name] [version].' - database: 'ase de datos: [database]' + database: 'Base de datos: [database]' manage: description: Mostrar el panel de gestión catalog: @@ -664,7 +664,7 @@ commands: delay: previous-command-cancelled: 'Anterior comando cancelado' stand-still: '¡No te muevas! Teletransportación en [seconds] segundos' - moved-so-command-cancelled: 'Te mudaste. Teleport cancelado!' + moved-so-command-cancelled: 'Te moviste. ¡Teletransporte cancelado!' island: about: description: Acerca de este addon @@ -741,7 +741,7 @@ commands: No hay vuelta atrás: una vez que se elimine su isla actual, habrá no forma de recuperarla más adelante. kicked-from-island: >- - Se te ha explusado de tu isla en [gamemode] porque el propietario la + Se te ha expulsado de tu isla en [gamemode] porque el propietario la está reiniciando. sethome: description: configura tu punto de teletransportación @@ -814,9 +814,9 @@ commands: info: description: Muestra información detallada sobre tu equipo. member-layout: - online: ' o [nombre]' + online: ' o [name]' offline: ' o [name] ([last_seen])' - offline-not-last-seen: ' o [nombre]' + offline-not-last-seen: ' o [name]' last-seen: layout: 'Hace [number] [unit]' days: dias @@ -824,7 +824,7 @@ commands: minutes: minutos header: |- --- Detalles del equipo --- - Miembros: [total] / [ max] + Miembros: [total]/[max] Miembros en línea: [online] rank-layout: owner: '[rank]:' @@ -845,7 +845,7 @@ commands: cannot-uncoop-yourself: 'No puedes remover permisos a ti mismo' cannot-uncoop-member: 'No puedes remover los permisos a un miembro de tu equipo!' player-not-cooped: 'Ese jugador no tiene permisos!' - you-are-no-longer-a-coop-member: 'Yano tienes permisos en la isla de [name]' + you-are-no-longer-a-coop-member: 'Ya no tienes permisos en la isla de [name]' all-members-logged-off: >- Todos los miembros de la isla se desconectaron, ya no tienes permisos en la isla de [name] @@ -858,12 +858,12 @@ commands: name-has-invited-you: >- [name] te ha invitado a unirte para ser un miembro confiable de su isla. - player-already-trusted: 'Player ya es de confianza!' + player-already-trusted: '¡El jugador ya es de confianza!' you-are-trusted: 'Has sido confiado por [name]!' success: 'Confió en [name] .' is-full: 'No puedes confiar en nadie más.' untrust: - description: eliminar el rango de jugador de confianza del jugadorr + description: eliminar el rango de confianza del jugador parameters: cannot-untrust-yourself: 'No puedes desconfiar de ti mismo!' cannot-untrust-member: 'No puedes desconfiar de un miembro del equipo!' @@ -873,7 +873,7 @@ commands: invite: description: invita a un jugador a unirse a tu isla invitation-sent: 'Invitación enviada a [name]' - removing-invite: 'Eliminando invitar' + removing-invite: 'Eliminando invitación' name-has-invited-you: '[name] Te ha invitado a unirte a su isla.' to-accept-or-reject: >- Pon /[label] team accept para aceptar, o /[label] team reject para @@ -953,14 +953,14 @@ commands: failure: 'El jugador no puede ser degradado más!' success: 'Degradar a [name] a [rank]' promote: - description: promoveer a un jugador en tu isla un rango + description: promover a un jugador en tu isla un rango parameters: errors: cant-promote-yourself: '¡No puedes promoverte a ti mismo!' cant-promote: '¡No puedes promoverte por encima de tu rango!' must-be-member: '¡El jugador debe ser miembro de [prefix_an-island]!' failure: 'El jugador no puede ser promovido más' - success: 'Promoveer a [name] a [rank]' + success: 'Promovido [name] a [rank]' setowner: description: transfiere la propiedad de tu isla a un miembro errors: @@ -979,8 +979,8 @@ commands: description: banea a un jugador de tu isla parameters: cannot-ban-yourself: 'No puedes banearte a ti mismo!' - cannot-ban: 'Es jugador no puede ser baneado.' - cannot-ban-member: 'Saca primero al miembre, y despues lo baneas.' + cannot-ban: 'Ese jugador no puede ser baneado.' + cannot-ban-member: 'Saca primero al miembro, y después lo baneas.' cannot-ban-more-players: >- Haz llenado tu lista de baneos, No Puedes banear a mas jugadores de tu isla. @@ -1041,7 +1041,7 @@ protection: hint: Interacción de Allay y Copper Golem deshabilitada ANIMAL_NATURAL_SPAWN: description: Alternar el desove natural de animales - name: Engendro natural animal + name: Aparición natural de animales ANIMAL_SPAWNERS_SPAWN: description: Alternar el desove de animales con reproductores name: Spawners de animales @@ -1101,8 +1101,8 @@ protection: hint: Cría de animales protegida BREWING: description: Interacción - name: Estante de cerveza - hint: No se permite la elaboración de cerveza + name: Soporte de pociones + hint: No se permite elaborar pociones BUCKET: description: Interacción del cubo name: Cubos @@ -1132,7 +1132,7 @@ protection: por banderas dedicadas. hint: Acceso al contenedor deshabilitado CHEST: - name: Cajas y cajas de minecart + name: Cofres y vagonetas con cofre description: |- Activar interacción con cofres y vagones de mina de cofres. @@ -1143,7 +1143,7 @@ protection: description: Cambiar la interacción con el barril hint: Acceso al barril deshabilitado CRAFTER: - name: Pañuelo + name: Crafter description: Alternar uso hint: Acceso de Crafter deshabilitado BLOCK_EXPLODE_DAMAGE: @@ -1153,7 +1153,7 @@ protection: entidades. name: Daño de explosión de bloque COMPOSTER: - name: Compuertas + name: Compostadores description: Alternar interacción con el compostador hint: Interacción con el compostador deshabilitada LOOM: @@ -1204,13 +1204,13 @@ protection: HOPPER: name: Tolvas description: Interacción de la Tolva - hint: Interacción de la Tova deshabilitado + hint: Interacción de la Tolva deshabilitada CHEST_DAMAGE: description: Alternar daño en el cofre por explosiones. name: Daño por Cofre CHORUS_FRUIT: description: Teletransporte - name: Fruta del coral + name: Fruta de Chorus hint: No teletransporte CLEAN_SUPER_FLAT: description: |- @@ -1382,8 +1382,8 @@ protection: description: >- Alternar daño. Habilitado significa que los animales domesticados pueden recibir daño. Deshabilitado significa que son invencibles. - name: Hurt animales domesticados - hint: Animal domesticado lastimando desactivado + name: Dañar animales domesticados + hint: Dañar animales domesticados desactivado HURT_ANIMALS: description: Modificar daño a los animales name: Daño a los animales @@ -1409,11 +1409,11 @@ protection: description: |- Configurar la configuración de visitantes invencibles. - name: 'Visitantes invisibles' + name: 'Visitantes invencibles' hint: 'Visitantes protegidos' ISLAND_RESPAWN: description: |- - Jugadores respawnearn + Los jugadores reaparecerán en la isla name: Isla respawn ITEM_DROP: @@ -1451,7 +1451,7 @@ protection: LIMIT_MOBS: description: |- Limitar entidades a - spawner en este mode + aparecer en este modo de juego. name: 'Limitar el spawn de la entidad' can: 'Pueden aparecer' @@ -1540,9 +1540,9 @@ protection: OFFLINE_REDSTONE: description: |- Cuando se deshabilita, la redstone - no operará en islas - donde todos los miembros están fuera de línea. - Puede ayudar a reducir el lag. + no operará en islas + donde todos los miembros están fuera de línea. + Puede ayudar a reducir el lag. name: Redstone Fuera de linea PETS_STAY_AT_HOME: description: |- @@ -1644,8 +1644,8 @@ protection: hint: No arrojar huevos de spawn SPAWNER_SPAWN_EGGS: description: |- - Permite cambiar el tipo de entidad de un generador - ausando huevos de desove. + Permite cambiar el tipo de entidad de un spawner + usando huevos de aparición. name: Huevos de spawnen spawners hint: >- no está permitido cambiar el tipo de entidad de un spawner usando huevos @@ -1693,14 +1693,14 @@ protection: fuera del rango de protección de una isla sino que también bloqueará la generación de hojas / troncos fuera de la isla - ortando así el árbol. + cortando así el árbol. TURTLE_EGGS: description: Modificar aplastante name: Huevos de tortuga hint: Los huevos de tortuga no pueden ser aplastados! FROST_WALKER: description: Modificar Encantamiento de Frost Walker - name: Walker de Hielo + name: Caminante de Escarcha hint: Frost Walker no puede ser usado aquí EXPERIENCE_PICKUP: name: Recoger experiencia @@ -1723,12 +1723,12 @@ protection: Los miembros de [prefix_Island] aún pierden sus objetos si mueren en su propio [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protección del vacío en la isla spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Cuando está activado, los jugadores que caigan + al vacío en la isla spawn + serán teletransportados de vuelta al + punto de aparición en lugar de morir. RAID_TRIGGER: name: Activador de asalto description: Establece el rango mínimo de isla requerido para activar un asalto @@ -1747,7 +1747,7 @@ protection: pueden usar cargas de viento en esta isla. hint: Uso de carga de viento desactivado WITHER_DAMAGE: - name: Alternar el daño de marchitar + name: Alternar el daño de Wither description: |- Si está activo, Withers puede dañar bloques y jugadores @@ -1806,7 +1806,7 @@ protection: title: '[world_name] Protecciones de mundos' description: |- Configuración de protección cuando - player está fuera de su isla + el jugador está fuera de su isla flag-item: name-layout: '[name]' command-instructions: @@ -1815,7 +1815,7 @@ protection: establecer el nombre ban: |- Selecciona el rango que puede - banear jugadores + banear jugadores unban: |- Selecciona el rango que puede desbanear jugadores @@ -1922,7 +1922,7 @@ management: SUPPORTED: | Corriendo [name] [version]. BentoBox esta corriendo en una version - SOPORTADA &por el server software y + SOPORTADA por el server software y version. La mayoría de sus características se ejecutarán sin problemas en este ambiente. @@ -1946,7 +1946,7 @@ catalog: GAMEMODES: title: Catalogo de Modo de juegos ADDONS: - title: Catalogo de Addos + title: Catálogo de Addons views: gamemodes: name: 'Modo De Juegos' @@ -1992,7 +1992,7 @@ enums: LIGHTNING: Rayos SUICIDE: Suicidio STARVATION: Hambruna - POISON: 'Veneno' + POISON: Veneno MAGIC: Magia WITHER: Wither FALLING_BLOCK: Bloque Caído @@ -2000,7 +2000,7 @@ enums: DRAGON_BREATH: Aliento de Dragón CUSTOM: Personalizado FLY_INTO_WALL: Vuela Hacia la Pared - HOT_FLOOR: 'Suelo Caliente' + HOT_FLOOR: Suelo Caliente CRAMMING: Cramming DRYOUT: Secado FREEZE: Congelar From 55a7e34ea166ceefe6b10ac611d79abe19d48fbf Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:10:50 -0700 Subject: [PATCH 09/95] Fix French (fr.yml) locale: fix 30+ broken legacy tags, mistranslations, typos, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes pervasive &un/&une broken legacy color codes throughout flag descriptions, untranslated English in maxsize/SPAWN_PROTECTION/several flag names, wrong translations (Automne/Autumn for Fall, Minerai for Briquet, Tirants for Droppers, chœur for Chorus, Frappez for Expulsez), reversed unban messages, AI response in conversation-prefix, translated placeholders, missing 'B' in Bienvenue, and many other issues. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/fr.yml | 277 +++++++++++++++--------------- 1 file changed, 143 insertions(+), 134 deletions(-) diff --git a/src/main/resources/locales/fr.yml b/src/main/resources/locales/fr.yml index 40e9ac2fe..493430c7c 100644 --- a/src/main/resources/locales/fr.yml +++ b/src/main/resources/locales/fr.yml @@ -172,7 +172,7 @@ commands: données rank-on-island: '[rank] sur l''île à [xyz]' fixed: 'Fixe' - done: '&Un scanner' + done: 'Analyse terminée' kick: parameters: description: Kicker le joueur de son équipe @@ -197,10 +197,10 @@ commands: plus que ce qui est autorisé par les paramètres ou les permissions : [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Définir la taille max d'équipe pour l'[prefix_island] d'un joueur (0 pour revenir au défaut du monde) + success: 'Taille max d''équipe de [name] sur [prefix_island] définie à [number].' + reset: 'Taille max d''équipe de [name] sur [prefix_island] réinitialisée au défaut du monde ([number]).' range: description: rayon de la zone de protection de l'île invalid-value: @@ -296,14 +296,14 @@ commands: max-trusted-size: 'Taille maximale de confiance : [number]' island-protection-center: "Centre de la zone de protection\_: [xyz]" island-center: "Centre de l'île\_: [xyz]" - island-coords: 'Coordonnées de l''île : [xz1] to [xz2]' + island-coords: 'Coordonnées de l''île : [xz1] à [xz2]' islands-in-trash: 'Le joueur a des îles dans la Corbeille.' protection-range: 'Rayon de protection : [range]' protection-range-bonus-title: "Comprend ces bonus\_:" protection-range-bonus: "Bonus\_:\_[number]" purge-protected: L'île est protégée contre la purge max-protection-range: 'La plus grande gamme de protection historique: [range]' - protection-coords: 'Coordonnées de protection: [xz1] to [xz2]' + protection-coords: 'Coordonnées de protection : [xz1] à [xz2]' is-spawn: L'île est un spawn banned-players: 'Joueurs bannis : ' banned-format: '[name]' @@ -381,7 +381,7 @@ commands: description: définir le rang d'un joueur sur son île ou sur celle du propriétaire unknown-rank: 'Rang inconnu!' not-possible: 'Le classement doit être supérieur à celui du visiteur.' - rank-set: 'Rang défini de [from] à [to] &sur l''île de [name].' + rank-set: 'Rang défini de [from] à [to] sur l''île de [name].' setprotectionlocation: parameters: '[coordonnées x y z]' description: >- @@ -516,7 +516,7 @@ commands: Certains caractères ont été supprimés car ils ne sont pas autorisés. Le nouvel identifiant sera [name]. success: Succès! - conversation-prefix: Sure! Please provide the text you would like to have translated. + conversation-prefix: '>' description: quit: quitter instructions: >- @@ -565,7 +565,7 @@ commands: config.yml confirm: 'Cela réinitialisera les flags par défaut pour toutes les îles!' success: 'Réinitialisation des flags de toutes les îles aux valeurs par défaut.' - success-one: 'flag[name] défini par défaut pour toutes' + success-one: 'Flag [name] défini par défaut pour toutes les îles.' world: description: Gérer les paramètres du monde delete: @@ -680,7 +680,7 @@ commands: list: 'Les rangs enregistrés sont les suivants :' confirmation: confirm: >- - Entrez à nouveau la commande dans [secondes] secondes pour + Entrez à nouveau la commande dans [seconds] secondes pour confirmer. previous-request-cancelled: 'La demande de confirmation est annulée.' request-cancelled: 'Délai de confirmation dépassé - demande annulée.' @@ -727,13 +727,13 @@ commands: estimated-time: 'Durée estimée : [number] secondes.' blocks: 'Construire bloc par bloc: [number] blocs en tout ...' entities: 'Remplissage avec des entités : [number] entités en tout ...' - dimension-done: '&Une île dans [world] est construite.' + dimension-done: 'L''île dans [world] est construite.' done: 'C''est fait! Votre île est prête et vous attend!' pick: 'Choisissez une île' cannot-afford: 'Vous ne pouvez pas vous le permettre ! Coût : [cost]' unknown-blueprint: 'Ce blueprint n''existe pas.' on-first-login: >- - ienvenue! Nous commencerons à préparer votre île dans quelques + Bienvenue ! Nous commencerons à préparer votre île dans quelques secondes. you-can-teleport-to-your-island: 'Vous pouvez vous téléporter sur votre île quand vous le désirez.' deletehome: @@ -840,7 +840,7 @@ commands: description: afficher des informations détaillées sur votre équipe member-layout: online: 'o [name]' - offline: 'o [name] ([last_seen])' + offline: 'o [name] ([last_seen])' offline-not-last-seen: 'o [name]' last-seen: layout: 'il y a [number] [unit]' @@ -898,7 +898,7 @@ commands: name-has-invited-you: '[name] vous a invité à rejoindre son île.' to-accept-or-reject: >- Faites /[label] team accept pour accepter ou /[label] team - reject] pour refuser. + reject pour refuser. you-will-lose-your-island: 'ATTENTION ! Vous perdrez votre île actuelle si vous acceptez !' gui: titles: @@ -962,9 +962,9 @@ commands: kick: description: supprimer un membre de votre île parameters: - player-kicked: "Le [name] vous a expulsé de l'île en [mode de jeu]\_!" - cannot-kick: 'Vous ne pouvez pas vous botter!' - cannot-kick-rank: "Votre rang ne vous permet pas de donner un coup de pied à [name]\_!" + player-kicked: '[name] vous a expulsé de l''île en [gamemode] !' + cannot-kick: 'Vous ne pouvez pas vous expulser vous-même !' + cannot-kick-rank: 'Votre rang ne vous permet pas d''expulser [name] !' success: '[name] a été exclu de votre île.' demote: description: rétrograder un joueur de votre île à un rang inférieur @@ -974,7 +974,7 @@ commands: cant-demote: "Vous ne pouvez pas rétrograder des rangs supérieurs\_!" must-be-member: 'Le joueur doit être membre de [prefix_an-island]!' failure: 'Le joueur ne peut plus être rétrogradé!' - success: '&un [name] rétrogradé à [rank]' + success: '[name] rétrogradé à [rank]' promote: description: promouvoir un joueur de votre île à un rang supérieur parameters: @@ -983,7 +983,7 @@ commands: cant-promote: "Vous ne pouvez pas promouvoir au-dessus de votre rang\_!" must-be-member: 'Le joueur doit être membre de [prefix_an-island]!' failure: 'Le joueur ne peut plus être promu!' - success: '&un [name] promu au [rank]' + success: '[name] promu au [rank]' setowner: description: transférer la propriété de votre île à un membre errors: @@ -1001,24 +1001,24 @@ commands: parameters: cannot-ban-yourself: 'Vous ne pouvez pas vous interdire!' cannot-ban: 'Ce joueur ne peut pas être banni.' - cannot-ban-member: 'Frappez d''abord le membre de l''équipe, puis bannissez.' + cannot-ban-member: 'Expulsez d''abord le membre de l''équipe, puis bannissez.' cannot-ban-more-players: >- Vous avez atteint la limite d'interdiction, vous ne pouvez plus interdire d'autres joueurs de votre île. - player-already-banned: 'Player est déjà banni.' + player-already-banned: 'Le joueur est déjà banni.' player-banned: '[name] est désormais banni de votre île.' owner-banned-you: '[name] vous a banni de leur île!' you-are-banned: 'Vous êtes banni de cette île!' unban: description: débannir un joueur de votre île parameters: - cannot-unban-yourself: 'Vous ne pouvez pas vous défaire!' - player-not-banned: 'Le lecteur n''est pas interdit.' - player-unbanned: '[name] est désormais interdit sur votre île.' - you-are-unbanned: '[name] vous a banni de leur île!' + cannot-unban-yourself: 'Vous ne pouvez pas vous débannir vous-même !' + player-not-banned: 'Ce joueur n''est pas banni.' + player-unbanned: '[name] n''est plus banni de votre île.' + you-are-unbanned: '[name] vous a débanni de son île !' banlist: description: lister les joueurs bannis - noone: 'Personne n''est interdit sur cette île.' + noone: 'Personne n''est banni de cette île.' the-following: 'Les joueurs suivants sont bannis:' names: '[line]' you-can-ban: 'Vous pouvez bannir jusqu''à [number] joueurs supplémentaires.' @@ -1061,11 +1061,11 @@ protection: description: Autoriser le don et le transport d'objets vers/depuis Allay et Copper Golem hint: Interaction Allay & Copper Golem désactivée ANIMAL_NATURAL_SPAWN: - description: Activer/désactiver le frai naturel des animaux - name: Frai naturel des animaux + description: Activer/désactiver l'apparition naturelle des animaux + name: Apparition naturelle des animaux ANIMAL_SPAWNERS_SPAWN: - description: Activer/désactiver le frai des animaux avec des géniteurs - name: reproducteurs d'animaux + description: Activer/désactiver l'apparition des animaux avec des spawners + name: Spawners d'animaux ANVIL: description: Autoriser l'utilisation des enclumes name: Enclumes @@ -1123,9 +1123,9 @@ protection: name: Alambics hint: Brassage désactivé BUCKET: - description: vous ne pouvez pas utiliser les alambics + description: Autoriser l'utilisation des seaux name: Seaux - hint: Utilisation du godet désactivée + hint: Utilisation des seaux désactivée BUTTON: description: Autoriser l'interaction avec les boutons name: Boutons @@ -1145,34 +1145,34 @@ protection: CONTAINER: name: Conteneurs description: |- - et une interaction Toggle avec les coffres, - &un shulker boîtes et pots de fleurs, - &un composteurs et des barils. + Activer/désactiver l'interaction avec les coffres, + boîtes de Shulker, pots de fleurs, + composteurs et barils. - D'autres conteneurs sont manipulés + D'autres conteneurs sont gérés par des drapeaux dédiés. hint: vous ne pouvez pas ouvrir les conteneurs CHEST: name: Coffres et coffres de minecart description: |- Activer/désactiver l'interaction avec les coffres - &un et des minecarts de coffre. + et les minecarts de coffre. (n'inclut pas les coffres piégés) - hint: Accès à la coffre désactivé + hint: Accès au coffre désactivé BARREL: name: Barils - description: Activer/désactiver l'interaction du canon + description: Activer/désactiver l'interaction du baril hint: Accès au baril désactivé CRAFTER: - name: Artisan - description: Faire de l'utilisation - hint: Crafter Accès désactivé + name: Crafter + description: Basculer l'utilisation + hint: Accès au Crafter désactivé BLOCK_EXPLODE_DAMAGE: description: |- Autoriser les ancres de lit et de réapparition pour briser les blocs et endommager entités. - name: Bloquer les dégâts d'explosion + name: Dégâts d'explosion de bloc COMPOSTER: name: Composteurs description: Activer/Désactiver l'interaction du composteur @@ -1195,7 +1195,7 @@ protection: hint: Accès à la boîte Shulker désactivé SHULKER_TELEPORT: description: |- - &un Shulker peut se téléporter + Le Shulker peut se téléporter si actif. name: Téléportation de Shulker SMITHING: @@ -1215,7 +1215,7 @@ protection: description: Autoriser l'interaction avec dispensers hint: vous ne pouvez pas interagir avec les dispensers DROPPER: - name: Tirants + name: Droppers description: Autoriser l'interaction avec les droppers hint: vous ne pouvez pas interagir avec les droppers ELYTRA: @@ -1231,31 +1231,31 @@ protection: name: Dégâts de Coffre CHORUS_FRUIT: description: Activer/désactiver la téléportation - name: Fruits de chœur - hint: Téléportation des fruits du choeur désactivée + name: Fruits de Chorus + hint: Téléportation des fruits de Chorus désactivée CLEAN_SUPER_FLAT: description: |- - Activer pour nettoyer tout - es morceaux super plats dans - &un monde insulaire + Activer pour nettoyer tous + les chunks super plats dans + les mondes d'îles name: Nettoyer Super Plat COARSE_DIRT_TILLING: description: |- - &Un basculement grossier du labour - &un podzol sale et cassant - pour obtenir la saleté + Activer/désactiver le labourage de + la terre grossière et la destruction + du podzol pour obtenir de la terre name: Labour de terre grossière hint: Pas de labour de terre friche COLLECT_LAVA: description: |- - &un Toggle collecte de lave - (remplacer les compartiments) + Activer/désactiver la collecte de lave + (remplace les Seaux) name: Collecter de la lave hint: Pas de collecte de lave COLLECT_WATER: description: |- - &un Toggle collectant l'eau - (remplacer les compartiments) + Activer/désactiver la collecte d'eau + (remplace les Seaux) name: Collecter de l'eau hint: Seaux d'eau désactivés COLLECT_POWDERED_SNOW: @@ -1272,19 +1272,19 @@ protection: name: Tables de crafting hint: Accès au plan de travail désactivé CREEPER_DAMAGE: - description: Toggle creeper damage + description: Activer/désactiver les dégâts de Creeper name: Dégâts de Creeper CREEPER_GRIEFING: - description: Toggle creeper griefing - name: Creeper griefing - hint: Creeper chagrin désactivé + description: Activer/désactiver le griefing de Creeper + name: Griefing de Creeper + hint: Griefing de Creeper désactivé CROP_PLANTING: description: 'Définir qui peut planter des graines.' name: Plantation de cultures hint: Plantation de cultures désactivée CROP_TRAMPLE: description: Basculer le piétinement des cultures - name: '&p&Écraser les cultures' + name: Piétinement des cultures hint: Piétinement des cultures désactivé DOOR: description: Bascule l'utilisation de la porte @@ -1316,14 +1316,14 @@ protection: hint: Les coffres de l'Ender sont désactivés dans ce monde. ENDERMAN_DEATH_DROP: description: |- - &un Endermen tombera - et un bloc qu'ils sont - &un holding s'il est tué. + Les Endermen lâcheront + tout bloc qu'ils tiennent + s'ils sont tués. name: Drop de mort d'Enderman ENDERMAN_GRIEFING: description: |- - &un Endermen peut supprimer - &un pâté de maisons des îles + Les Endermen peuvent retirer + des blocs des îles name: Griefing par des Endermen ENDERMAN_TELEPORT: description: |- @@ -1331,7 +1331,7 @@ protection: si actif. name: Téléportation Enderman ENDER_PEARL: - description: Faire de l'utilisation + description: Basculer l'utilisation name: Perles d'Ender hint: Utilisation d'Enderpearl désactivée ENTER_EXIT_MESSAGES: @@ -1349,8 +1349,8 @@ protection: FIRE_BURNING: name: Feu qui brûle description: |- - bascule si le feu peut brûler - &un bloc ou non. + Bascule si le feu peut brûler + des blocs ou non. FIRE_EXTINGUISH: description: Basculer l'extinction des feux name: Éteindre le feu @@ -1370,7 +1370,7 @@ protection: description: Autoriser la capture de poissons avec un seau hint: Écopage de poisson désactivé FLINT_AND_STEEL: - name: Minerai de silex et d'acier + name: Briquet description: |- Autorise les joueurs à allumer des feux ou des feux de camp en utilisant @@ -1386,12 +1386,15 @@ protection: hint: Utilisation de la porte désactivée GEO_LIMIT_MOBS: description: |- - Supprimer les mobs qui partent - &un extérieur protégé - &un espace insulaire + Supprimer les mobs qui sortent + de l'espace protégé + de l'île name: 'Limiter les foules à l''île' HARVEST: - description: "Définir qui peut récolter les récoltes.\nN'oubliez pas d'autoriser l'élément\n& un pick-up aussi\_!" + description: |- + Définir qui peut récolter les cultures. + N'oubliez pas d'autoriser le ramassage + d'objets aussi ! name: Récolte des cultures hint: Récolte désactivée HIVE: @@ -1406,37 +1409,37 @@ protection: hint: Animal apprivoisé blessé désactivé HURT_ANIMALS: description: Activer/Désactiver les dégâts - name: 'Animaux blessés' - hint: Animal blessé handicapé + name: Blesser les animaux + hint: Blesser les animaux désactivé HURT_MONSTERS: description: Activer/Désactiver les dégâts - name: Monstres blessés - hint: Monstre blessé désactivé + name: Blesser les monstres + hint: Blesser les monstres désactivé HURT_VILLAGERS: description: Activer/désactiver les dégâts - name: Villagers blessés - hint: Villageois blessé handicapé + name: Blesser les villageois + hint: Blesser les villageois désactivé ITEM_FRAME: name: Cadre d'objet description: |- - une interaction Toggle. - Remplace le lieu ou brise les blocs + Activer/désactiver l'interaction. + Remplace le placement ou la destruction de blocs hint: L'utilisation du cadre d'objet est désactivée ITEM_FRAME_DAMAGE: description: |- - un Mobs peut endommager - un élément cadres + Les mobs peuvent endommager + les cadres d'objet name: Dégât de Cadre d'Objet INVINCIBLE_VISITORS: description: |- - onfigurer un visiteur invincible - &un paramètres. + Configurer les paramètres + des visiteurs invincibles. name: 'Visiteurs invincibles' hint: 'Visiteurs protégés' ISLAND_RESPAWN: description: |- - Joueurs réapparaissent - &un sur l'île + Les joueurs réapparaissent + sur l'île name: Island respawn ITEM_DROP: description: Basculer le lâcher @@ -1486,8 +1489,8 @@ protection: Basculez si les liquides peuvent s'écouler à l'extérieur de la gamme de protection de l'île. Le désactiver permet d'éviter la lave et l'eau - pavé générateur dans la zone entre - eux îles. + de générer de la pierre entre + deux îles. Notez que les liquides continueront de couler verticalement. Ils ne se répandront pas non plus horizontalement si @@ -1495,19 +1498,19 @@ protection: plage de protection. LOCK: description: Basculer le verrou - name: Lock island + name: Verrouiller l'île CHANGE_SETTINGS: name: Modifier les paramètres description: |- - Autoriser le changement de membre - &un rôle peut modifier les paramètres de l'îlot. + Autoriser quel rôle de membre + peut modifier les paramètres de l'île. MILKING: description: Activer/désactiver la traite des vaches name: Traite - hint: Vaches laitières handicapées + hint: Traite des vaches désactivée MINECART: name: Chariots minecarts - description: Toggle minecart interactions + description: Activer/désactiver les interactions avec les minecarts hint: Interaction Minecart désactivée MONSTER_NATURAL_SPAWN: description: Activer/désactiver l'apparition naturelle des monstres @@ -1517,8 +1520,8 @@ protection: name: Générateurs de monstres MOUNT_INVENTORY: description: |- - &un accès Toggle - pour monter l'inventaire + Activer/désactiver l'accès + à l'inventaire de monture name: Inventaire de monture hint: Inventaire de montage désactivé NAME_TAG: @@ -1528,9 +1531,9 @@ protection: NATURAL_SPAWNING_OUTSIDE_RANGE: name: Apparition de créatures naturelles en dehors de la portée description: |- - Basculez si les créatures (animaux et - et un monstre) peuvent apparaître naturellement à l'extérieur - a plage de protection d'une île. + Bascule si les créatures (animaux et + monstres) peuvent apparaître naturellement en dehors + de la plage de protection d'une île. Notez que cela n'empêche pas les créatures pour se reproduire via un générateur de mob ou un spawn @@ -1561,7 +1564,7 @@ protection: OFFLINE_GROWTH: description: |- Lorsque désactivé, les plantes - ne poussera pas sur les îles + ne pousseront pas sur les îles où tous les membres sont hors ligne. Peut aider à réduire le décalage. name: Croissance Hors Ligne @@ -1575,10 +1578,10 @@ protection: name: Redstone Hors Ligne PETS_STAY_AT_HOME: description: |- - Lorsqu'il est actif, animaux apprivoisés - ne peut aller qu'à et - ne peut pas quitter le propriétaire - &une île natale. + Lorsqu'actif, les animaux apprivoisés + ne peuvent aller que sur + l'île du propriétaire et + ne peuvent pas la quitter. name: Les animaux restent à la maison PISTON_PUSH: description: |- @@ -1598,7 +1601,7 @@ protection: POTION_THROWING: name: Lancer de potions description: |- - actier/désactiver le jet des potions. + Activer/désactiver le jet des potions. Cela inclut les éclaboussures et les potions persistantes. hint: Lancer des potions désactivé NETHER_PORTAL: @@ -1607,7 +1610,7 @@ protection: hint: Utilisation du portail désactivée END_PORTAL: description: Basculer l'utilisation - name: Portail de Fin + name: Portail de l'End hint: Utilisation du portail désactivée PAUSE_MOB_GROWTH: name: Pause croissance des mobs @@ -1653,7 +1656,7 @@ protection: Empêche la sortie de The_End de se générer aux coordonnées 0,0 - name: Remove end exit island + name: Supprimer l'île de sortie de l'End REMOVE_MOBS: description: |- Supprimer des monstres lorsque @@ -1662,7 +1665,7 @@ protection: RIDING: description: Basculer le monture name: Montée d'animaux - hint: Equitation pour animaux handicapés + hint: Monter les animaux désactivé SHEARING: description: Activer/désactiver la tonte name: Tondre @@ -1681,20 +1684,20 @@ protection: autorisé. SCULK_SENSOR: description: |- - Active/désactive le capteur Sculk - &une activation. + Active/désactive l'activation + du capteur Sculk. name: Capteur Sculk hint: l'activation du capteur Sculk est désactivée SCULK_SHRIEKER: description: |- - Active/désactive le crieur de Sculk - &une activation. + Active/désactive l'activation + du crieur de Sculk. name: Hurleur de Sculk hint: l'activation du Sculk Shrieker est désactivée SIGN_EDITING: description: |- Permet l'édition de texte - de signes + des panneaux name: Édition de panneaux hint: l'édition des panneaux est désactivée TNT_DAMAGE: @@ -1723,7 +1726,7 @@ protection: description: |- Activer / désactiver la croissance des arbres en dehors d'une plage de protection d'une île ou non. - Non seulement cela empêchera les jeunes arbres plcés hors de la + Non seulement cela empêchera les jeunes arbres placés hors de la plage de protection d'une île de grandir, mais il va également bloquer la génération de feuilles / bûches en dehors de l'île, donc cela @@ -1749,14 +1752,20 @@ protection: hint: 'Vous ne pouvez pas faire cela en tombant.' VISITOR_KEEP_INVENTORY: name: Les visiteurs gardent l'inventaire au décès - description: "Empêcher les joueurs de perdre leur\nobjets et expérience s'ils meurent\nune île dans laquelle ils sont un visiteur.\n&un\nLes membres de Island perdent toujours leurs objets\ns'ils meurent sur leur propre île\_!" + description: |- + Empêche les joueurs de perdre leurs + objets et leur expérience s'ils meurent + sur une île où ils sont visiteurs. + + Les membres de l'île perdent toujours leurs objets + s'ils meurent sur leur propre île ! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protection du vide sur l'île spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Lorsqu'activé, les joueurs qui tombent + dans le vide sur l'île spawn + seront téléportés au point + de spawn au lieu de mourir. RAID_TRIGGER: name: Déclencheur de raid description: Définit le rang minimum d'île requis pour déclencher un raid @@ -1843,7 +1852,7 @@ protection: définir le nom ban: |- Sélectionnez le rang qui peut - bannir des joueurs + bannir des joueurs unban: |- Sélectionnez le rang qui peut débannir les joueurs @@ -1949,7 +1958,7 @@ management: COMPATIBLE . Ses fonctionnalités sont entièrement conçues pour - course dans cet environnement. + fonctionner dans cet environnement. SUPPORTED: | Tourne sous [name] [version] . @@ -2016,33 +2025,33 @@ catalog: enums: DamageCause: CONTACT: Contact - ENTITY_ATTACK: Attaque de foule + ENTITY_ATTACK: Attaque d'entité ENTITY_SWEEP_ATTACK: Attaque par balayage PROJECTILE: Projectiles SUFFOCATION: Étouffement - FALL: Automne + FALL: Chute FIRE: Feu FIRE_TICK: Brûlant MELTING: Fusion LAVA: Lave DROWNING: Noyade - BLOCK_EXPLOSION: Bloquer l'explosion + BLOCK_EXPLOSION: Explosion de bloc ENTITY_EXPLOSION: Explosion d'entité VOID: Vide LIGHTNING: Foudre SUICIDE: Suicide - STARVATION: famine + STARVATION: Famine POISON: Poison - MAGIC: la magie - WITHER: Flétrir + MAGIC: Magie + WITHER: Wither FALLING_BLOCK: Bloc qui tombe - THORNS: Les épines + THORNS: Épines DRAGON_BREATH: Souffle du dragon - CUSTOM: Coutume + CUSTOM: Personnalisé FLY_INTO_WALL: Voler dans le mur HOT_FLOOR: Plancher chaud CRAMMING: Bourrage - DRYOUT: Déssecher + DRYOUT: Assèchement FREEZE: Gel KILL: Tuer SONIC_BOOM: Boom Sonique From 709934b699d2b5553b1ebf95c8f1601bf9664b61 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:15:34 -0700 Subject: [PATCH 10/95] Fix Italian (it.yml) locale: correct mistranslations, typos, broken tags, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English: maxsize section, SPAWN_PROTECTION flag, DRAGON_EGG description, FIRE_SPREAD description, catalog view descriptions, range description - Fix broken legacy color codes: &-prefixed strings on not-in-team, unowned, use-switch, use-emptytrash replaced with MiniMessage tags - Fix typos: rabngo->rango, opiati->Copiati, alvoro->lavoro, teletrasposrto->teletrasporto, smostra->mostra, Disbilitando->Disabilitando, disablitata->disabilitata, commando->comando, "is non è"->non è - Fix wrong translations: DROWNING Affogare->Annegamento, THORNS Rami->Spine, STARVATION Carestia->Fame, FLY_INTO_WALL Vola->Impatto, FREEZE/KILL to nouns, Commissioni->Commit, Invalido->Non valido, "I animali"->"Gli animali", "sovrascrivi noci"->"sovrascrive i Secchi" Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/it.yml | 88 +++++++++++++++---------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/main/resources/locales/it.yml b/src/main/resources/locales/it.yml index 244fbfb29..e89c44c29 100644 --- a/src/main/resources/locales/it.yml +++ b/src/main/resources/locales/it.yml @@ -12,7 +12,7 @@ prefixes: islands: isole general: success: 'Successo!' - invalid: Invalido + invalid: Non valido beta: 'Questo comando è in beta. Assicurati di avere backup!' errors: command-cancelled: 'Comando annullato.' @@ -29,8 +29,8 @@ general: Non è stato possibile trovare un luogo sicuro per teletrasportarti nell'isola. not-owner: 'Non sei il proprietario della tua isola!' - player-is-not-owner: '[name] is non è il proprietario di nessuna isola!' - not-in-team: '&Quel giocatore non è nel tuo team!' + player-is-not-owner: '[name] non è il proprietario di nessuna isola!' + not-in-team: 'Quel giocatore non è nel tuo team!' offline-player: 'Quel giocatore è offline o non esiste.' unknown-player: '[name] è un giocatore sconosciuto!' general: 'Quel comando non è ancora pronto - contatta un''admin' @@ -52,7 +52,7 @@ commands: end: '=================================' page: 'Pagina [page] di [total]' parameters: '[command]' - description: commando di aiuto + description: comando di aiuto console: Console admin: help: @@ -192,12 +192,12 @@ commands: Attenzione: questo giocatore possiede ora [number] isole. Questo è più di quanto consentito dalle impostazioni o dai permessi: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Imposta la dimensione massima del team per il [prefix_island] di un giocatore (usa 0 per ripristinare il valore predefinito del mondo) + success: 'Impostata la dimensione massima del team di [name] per [prefix_island] a [number].' + reset: 'Ripristinata la dimensione massima del team di [name] per [prefix_island] al valore predefinito del mondo ([number]).' range: - description: Admin island range command + description: Comando admin per il raggio dell'isola invalid-value: too-low: 'Il raggio di protezione deve essere più grande di 1!' too-high: >- @@ -292,7 +292,7 @@ commands: is-spawn: L'isola è un'isola di spawn banned-players: 'Giocatori banditi:' banned-format: '[name]' - unowned: '&Senza proprietario' + unowned: 'Senza proprietario' bundle: 'Pacchetto Blueprint utilizzato per creare l''isola: [name]' switch: description: attiva/disattiva il bypass della protezione @@ -319,10 +319,10 @@ commands: title: '=========== Isole nel Cestino ===========' count: 'Isola [number]:' use-switch: >- - &Usa [label] switchto per scambiare l'isola del - player con quella nel cestino + Usa [label] switchto per scambiare l'isola del + giocatore con quella nel cestino use-emptytrash: >- - &Usa [label] emptytrash [player]per rimuovere permanentemente le + Usa [label] emptytrash [player] per rimuovere permanentemente le isole nel cestino emptytrash: parameters: '[player]' @@ -355,7 +355,7 @@ commands: description: teleporta un giocatore all'[prefix_island] di un altro giocatore getrank: parameters: - description: ottieni il rabngo di un player nella sua isola + description: ottieni il rango di un giocatore nella sua isola rank-is: 'Il rango è [rank] nella sua isola.' setrank: parameters: @@ -416,12 +416,12 @@ commands: impostata! need-pos1-pos2: 'Imposta la posizione 1 e la posizione 2 prima!' copying: 'Copiando i blocchi...' - copied-blocks: 'opiati [number] blocchi nella clipboard' + copied-blocks: 'Copiati [number] blocchi nella clipboard' look-at-a-block: 'Guarda verso un blocco entro 20 blocchi per impostare una posizione' mid-copy: >- Sei in mezzo al processo di copia. Aspetta finchè la copia non è completata. - copied-percent: 'opiati [number]%' + copied-percent: 'Copiati [number]%' copy: parameters: '[air]' description: >- @@ -574,7 +574,7 @@ commands: parameters: description: abilita/disabilita i report di debug di protezione nella console turning-on: Abilitando il debug in console per [name]. - turning-off: Disbilitando il debug in console per [name]. + turning-off: Disabilitando il debug in console per [name]. deaths: description: modifica le morti di un giocatore reset: @@ -730,7 +730,7 @@ commands: description: mostra info riguardo la tua isola o riguardo quella di un giocatore parameters: near: - description: smostra il nome delle isole adiacenti alla tua + description: mostra il nome delle isole adiacenti alla tua parameters: '' the-following-islands: 'Le seguenti isole sono adiacenti:' syntax: '[direction]: [name]' @@ -1247,7 +1247,7 @@ protection: COLLECT_POWDERED_SNOW: description: |- Attiva la raccolta della neve in polvere - (sovrascrivi noci) + (sovrascrive i Secchi) name: Raccogli neve in polvere hint: Secchi di neve in polvere disabilitati COMMAND_RANKS: @@ -1255,7 +1255,7 @@ protection: description: 'Configura i comandi dei ranghi' CRAFTING: description: Abilita/disabilita uso - name: Banchi da alvoro + name: Banchi da lavoro hint: Uso di banchi da lavoro vietato CREEPER_DAMAGE: description: Abilita/disabilita danni dei creeper @@ -1279,10 +1279,10 @@ protection: DRAGON_EGG: name: Uovo di drago description: |- - Prevents interaction with Dragon Eggs. + Impedisce l'interazione con le Uova di Drago. - This does not protect it from being - placed or broken. + Non protegge dal piazzamento + o dalla rottura. hint: No interazioni con uovo di drago DYE: description: Evita l'uso di coloranti @@ -1349,12 +1349,12 @@ protection: FIRE_SPREAD: name: Espansione di fuochi description: |- - Toggle whether fire can spread - to nearby blocks or not. + Scegli se il fuoco può espandersi + ai blocchi vicini oppure no. FISH_SCOOPING: name: Raccolta di pesci description: Permetti la raccolta dei pesci utilizzando un secchio - hint: Raccolta di pesci disablitata + hint: Raccolta di pesci disabilitata FLINT_AND_STEEL: name: Acciarino description: |- @@ -1561,7 +1561,7 @@ protection: possono solo andare e non possono lasciare la casa del proprietario [prefix_island]. - name: I animali domestici restano a casa + name: Gli animali domestici restano a casa PISTON_PUSH: description: |- Attiva questa opzione per evitare che i @@ -1639,7 +1639,7 @@ protection: REMOVE_MOBS: description: |- Rimuovi i mostri durante - il teletrasposrto all'isola + il teletrasporto all'isola name: Rimuovi i mostri RIDING: description: Abilita/disabilita cavalcatura @@ -1735,12 +1735,12 @@ protection: I membri di [prefix_Island] perdono comunque i loro oggetti se muoiono nella propria [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protezione dal vuoto nell'isola spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Quando attivo, i giocatori che cadono + nel vuoto nell'isola spawn + verranno teletrasportati al punto + di spawn invece di morire. RAID_TRIGGER: name: Attivazione incursione description: Imposta il rango minimo dell'isola richiesto per attivare un'incursione @@ -1963,13 +1963,13 @@ catalog: gamemodes: name: 'Modalità di gioco' description: | - Click to browse through the - available official Gamemodes. + Clicca per sfogliare le + Modalità di gioco ufficiali disponibili. addons: name: 'Addons' description: | - Click to browse through the - available official Addons. + Clicca per sfogliare gli + Addons ufficiali disponibili. icon: description-template: | [topic] @@ -2000,26 +2000,26 @@ enums: FIRE_TICK: Bruciando MELTING: Fusione LAVA: 'Lava' - DROWNING: Affogare + DROWNING: Annegamento BLOCK_EXPLOSION: Esplosione di Blocchi ENTITY_EXPLOSION: Esplosione dell'Entità VOID: Vuoto LIGHTNING: Fulmine SUICIDE: Suicidio - STARVATION: Carestia + STARVATION: Fame POISON: Veleno MAGIC: Magia WITHER: Wither FALLING_BLOCK: Blocco Cadente - THORNS: Rami + THORNS: Spine DRAGON_BREATH: Respiro di Drago CUSTOM: Personalizzato - FLY_INTO_WALL: Vola Dentro al Muro + FLY_INTO_WALL: Impatto col Muro HOT_FLOOR: Pavimento Caldo CRAMMING: Cramming DRYOUT: Asciugatura - FREEZE: Congela - KILL: Uccidi + FREEZE: Congelamento + KILL: Uccisione SONIC_BOOM: Boom Sonico WORLD_BORDER: Confine del Mondo panel: @@ -2027,7 +2027,7 @@ panel: title: '[name] Crediti' contributor: name: '[name]' - description: 'Commissioni: [commits]' + description: 'Commit: [commits]' empty-here: name: 'Sembra vuoto qui...' description: >- From 6df3352c2c14fa48cbe7929ac7622fe6072778a4 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:16:16 -0700 Subject: [PATCH 11/95] Fix Korean (ko.yml) locale: translate English strings, fix broken codes and typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated maxsize section (parameters, description, success, reset) - Translate SPAWN_PROTECTION flag (name and description) - Fix broken legacy color codes: '& c', '& 7', '& a', '&' replaced with MiniMessage tags - Fix DamageCause mistranslations: FALL 가을->낙하, CONTACT 연락처->접촉, DRYOUT 드라이터->건조, CRAMMING 크래밍->밀착 - Fix LOOM broken tag in name, FLOWER_POT/SUFFOCATION remove English in brackets - Fix TRAPPED_CHEST 감금된->함정, BARREL 통 합->통, GRINDSTONE hint typo - Fix typos: 섬위->섬의, 답승->탑승, 프기->퍼기, 플수->퍼올 수, 흭득->획득 - Remove leftover English 'or' in emptytrash description - Fix NATURAL_SPAWNING_OUTSIDE_RANGE and PREVENT_TELEPORT_WHEN_FALLING broken '&' color code lines with proper MiniMessage tags - Fix reload warning broken '& c' color code Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ko.yml | 78 +++++++++++++++---------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/main/resources/locales/ko.yml b/src/main/resources/locales/ko.yml index e12b1ed95..5b492e2b5 100644 --- a/src/main/resources/locales/ko.yml +++ b/src/main/resources/locales/ko.yml @@ -16,9 +16,9 @@ general: invalid: 올바르지 않음 beta: '이 명령은 베타입니다. 백업이 있는지 확인하십시오!' errors: - command-cancelled: '& c 명령이 취소되었습니다.' + command-cancelled: '명령이 취소되었습니다.' no-permission: ' 당신은 이 명령어를 실행하기 위한 권한을 가지고있지 않습니다. 필요 권한 : ([permission]).' - insufficient-rank: '& c 당신의 랭크는 그렇게하기에 충분히 높지 않습니다! (& 7 [rank] & c)' + insufficient-rank: '당신의 랭크는 그렇게하기에 충분히 높지 않습니다! ([rank])' use-in-game: '이 명령어는 인게임에서만 사용할 수 있습니다.' use-in-console: '이 명령은 콘솔에서만 사용할 수 있습니다.' no-team: '당신은 다른 사람의 섬에 소속되어있지 않습니다!' @@ -175,10 +175,10 @@ commands: 경고: 이 플레이어는 현재 [number] 개의 섬을 소유하고 있습니다. 이는 설정이나 권한으로 허용된 수 [max]를 초과했습니다. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: <플레이어> <크기> + description: 플레이어의 [prefix_island] 최대 팀 크기를 설정합니다 (0으로 월드 기본값으로 초기화) + success: '[name]의 [prefix_island] 최대 팀 크기를 [number]로 설정했습니다.' + reset: '[name]의 [prefix_island] 최대 팀 크기를 월드 기본값([number])으로 초기화했습니다.' range: description: 어드민 섬 범위 명령어 invalid-value: @@ -198,7 +198,7 @@ commands: set: parameters: <플레이어> <범위> description: 섬 보호범위를 설정합니다 - success: '섬위 보호범위를 [number]로 설정하였습니다.' + success: '섬의 보호범위를 [number]로 설정하였습니다.' reset: parameters: <플레이어> description: 보호범위를 기본으로 되돌립니다 @@ -290,7 +290,7 @@ commands: use-emptytrash: '[label] emptytrash [player]를 사용하여 쓰레기통의 섬들을 삭제합니다' emptytrash: parameters: '[player]' - description: 쓰레기통에 있는 섬을 청소하거나, or 쓰레기통에 있는 모든 주인없는 섬을 청소합니다 + description: 쓰레기통에 있는 섬을 청소하거나, 쓰레기통에 있는 모든 주인없는 섬을 청소합니다 success: '쓰레기통을 비웠습니다' version: description: BentoBox와 애드온들의 버전을 보여줍니다 @@ -551,8 +551,8 @@ commands: addon: '[prefix_bentobox] [name]을(를) 리로드 하는 중입니다 .' addon-reloaded: '[prefix_bentobox][name] 이(가) 리로드되었습니다' warning: >- - [prefix_bentobox] & c 경고 : 리로드하면 불안정 해질수 있으므로 나중에 오류가 발생하면 서버를 다시 - 시작하십시오. + [prefix_bentobox] 경고: 리로드하면 불안정 해질수 있으므로 나중에 오류가 발생하면 서버를 다시 + 시작하십시오. unknown-addon: '[prefix_bentobox]알수없는 애드온 입니다!' locales: description: 번역 리로드 @@ -1046,7 +1046,7 @@ protection: (트랩 상자는 포함되지 않음) hint: '상자 접근이 비활성화되었습니다' BARREL: - name: 통 합 + name: 통 description: 배럴 상호작용 전환 hint: 배럴 접근 비활성화됨 CRAFTER: @@ -1064,17 +1064,17 @@ protection: description: 컴포스터 상호작용 전환 hint: 퇴비통 상호작용 비활성화됨 LOOM: - name: '룸[]' + name: 베틀 description: 사용 전환 - hint: 루미 접속 비활성화됨 + hint: 베틀 접근이 비활성화됨 FLOWER_POT: - name: 꽃 화분 [Flower pots] + name: 꽃 화분 description: 꽃 화분 상호작용 전환 hint: 꽃 화분 상호작용 비활성화됨 GRINDSTONE: name: 연마석 description: 사용 전환 - hint: 전환석 접근이 비활성화되었습니다 + hint: 연마석 접근이 비활성화되었습니다 SHULKER_BOX: name: 술커 박스 description: 셔커 박스 상호작용 전환하기 @@ -1093,7 +1093,7 @@ protection: description: 사용 전환 hint: 석재 절단 접근이 비활성화되었습니다. TRAPPED_CHEST: - name: 감금된 상자들 + name: 함정 상자 description: 잠긴 보물 상자 상호작용 전환 hint: 트랩된 상자 접근 비활성화됨 DISPENSER: @@ -1131,16 +1131,16 @@ protection: hint: 거친 흙 경작이 금지되어 있습니다 COLLECT_LAVA: description: |- - 용암을 플수 있는지 여부설정 + 용암을 퍼올 수 있는지 여부설정 양동이 사용 설정을 덮어씁니다 - name: 용암 프기 - hint: 용암을 플수 없습니다 + name: 용암 퍼기 + hint: 용암을 퍼올 수 없습니다 COLLECT_WATER: description: |- - 물을 플수 있는지 여부설정 + 물을 퍼올 수 있는지 여부설정 양동이 사용 설정을 덮어씁니다 - name: 물 프기 - hint: 물을 플수 없습니다 + name: 물 퍼기 + hint: 물을 퍼올 수 없습니다 COLLECT_POWDERED_SNOW: description: |- 분말 눈 수집 전환 @@ -1400,7 +1400,7 @@ protection: description: |- 생물 (동물과 몬스터) 자연스럽게 외부에서 스폰 할 수 있습니다 - & 섬의 보호 범위밖에 + 섬의 보호 범위밖에 생물을 방해하지는 않습니다. 몹 스폰 또는 계란을 통해 스폰 @@ -1409,7 +1409,7 @@ protection: name: 소리블록 hint: 소리블록 상호작용이 금지되어있습니다 OBSIDIAN_SCOOPING: - name: 흑요석 프기 + name: 흑요석 퍼기 description: |- 플레이어가 흑요석을 퍼 내도록 허용 용암으로 다시 빈 양동이와 함께. @@ -1524,7 +1524,7 @@ protection: name: 몬스터를 없앰 RIDING: description: 탑승 가능 여부 - name: 동물 답승 + name: 동물 탑승 hint: 동물 탑승이 허용되어있지 않습니다 SHEARING: description: 양털 깎기 가능여부 설정 @@ -1591,15 +1591,15 @@ protection: name: 차가운 걸음 hint: 차가운 걸음 인첸트를 사용할수 없습니다 EXPERIENCE_PICKUP: - name: 경험치 흭득 - description: 경험치를 흭득할수 있는지 설정합니다 - hint: 경험치를 흭득할수 없습니다 + name: 경험치 획득 + description: 경험치를 획득할수 있는지 설정합니다 + hint: 경험치를 획득할수 없습니다 PREVENT_TELEPORT_WHEN_FALLING: name: 떨어질때 tp를 할수 없게 합니다 description: |- 플레이어가 떨어질때 명령어를 사용하여 섬을 갈수 - & a 없게 합니다 + 없게 합니다 hint: '떨어지고 있을땐 그것을 할수 없습니다' VISITOR_KEEP_INVENTORY: name: 방문자는 죽었을 때 인벤토리를 유지합니다. @@ -1609,12 +1609,12 @@ protection: [prefix_Island] 멤버는 자신의 [prefix_island]에서 죽으면 여전히 아이템을 잃습니다! SPAWN_PROTECTION: - name: Spawn island void protection + name: 스폰 섬 공허 보호 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 활성화되면, 스폰 섬에서 + 공허로 떨어지는 플레이어는 + 죽는 대신 스폰 지점으로 + 텔레포트됩니다. RAID_TRIGGER: name: 레이드 트리거 description: 레이드를 시작하는 데 필요한 최소 섬 등급을 설정합니다 @@ -1854,12 +1854,12 @@ catalog: BentoBox가 구성에서 GitHub에 연결하도록 허용하거나 나중에 다시 시도하십시오. enums: DamageCause: - CONTACT: 연락처 + CONTACT: 접촉 ENTITY_ATTACK: 몹 공격 ENTITY_SWEEP_ATTACK: 스윕 공격 PROJECTILE: 발사체 - SUFFOCATION: 질식 [Suffocation] - FALL: 가을 + SUFFOCATION: 질식 + FALL: 낙하 FIRE: 불 FIRE_TICK: 불타는 MELTING: 녹기 @@ -1880,8 +1880,8 @@ enums: CUSTOM: 커스텀 FLY_INTO_WALL: 벽으로 날기 HOT_FLOOR: 뜨거운 바닥 - CRAMMING: 크래밍 - DRYOUT: 드라이터 + CRAMMING: 밀착 + DRYOUT: 건조 FREEZE: 동결 KILL: 죽이기 SONIC_BOOM: 소닉 붐 From e077f75a7292da4da8f0f24f9bc1a6e7f26d9d25 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:17:01 -0700 Subject: [PATCH 12/95] Fix Hungarian (hu.yml) locale: translate untranslated strings and fix mistranslations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English in maxsize and SPAWN_PROTECTION sections - Fix "Hollandia" (Netherlands) -> "Pokol" (Nether) for Minecraft Nether - Fix "lejátszó" (media player) -> "játékos" (player) throughout - Fix "ivadék/ívás" (offspring/fish spawning) -> "spawn/megjelenés" for mob spawning - Fix "mellkas" (body chest) -> "láda" (chest container) for chest blocks - Fix "Kúszónövény" (climbing plant) -> "Creeper" for Minecraft Creeper - Fix "gyász" (mourning) -> "rombolás" (griefing) for grief protection - Fix "csőcselék" (rabble) -> "mob" for entities - Fix "Fáklyák" (Torches) -> "Jeladók" for Beacons - Fix "Nem reklámozhatod" (can't advertise) -> "Nem léptetheted elő" (can't promote) - Fix DamageCause values: FALL, VOID, MELTING, CONTACT, WITHER - Fix unban messages that incorrectly said "banned" instead of "unbanned" - Fix setowner success "nem" (not) -> "most" (now) the owner - Fix "Overworl" typo -> "Overworld" - Fix broken &védelem legacy color code in Creeper griefing - Fix "fogyatékos/mozgáskorlátozott" (handicapped) -> "letiltva" (disabled) - Fix various item/entity terminology (Elem->Tárgy, Tétel->Tárgy) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/hu.yml | 222 +++++++++++++++--------------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/src/main/resources/locales/hu.yml b/src/main/resources/locales/hu.yml index 2ae16172c..6883d499a 100644 --- a/src/main/resources/locales/hu.yml +++ b/src/main/resources/locales/hu.yml @@ -77,7 +77,7 @@ commands: parameters: [[prefix_island] név] cleared: 'Otthon visszaállítva. [name]' resets: - description: szerkesztheti a lejátszó visszaállítási értékeit + description: szerkesztheti a játékos visszaállítási értékeit set: description: beállítja, hogy ez a játékos hányszor állította vissza a szigetét parameters: @@ -193,15 +193,15 @@ commands: confirmation: >- Biztos vagy benne, hogy a [name]-t akarod kijelölni a [prefix_island] tulajdonosának a [xyz]-nél? - success: '[name]nem a [prefix_island] tulajdonosa.' + success: '[name] most a [prefix_island] tulajdonosa.' extra-islands: >- Figyelmeztetés: ez a játékos most [number] szigettel rendelkezik. Ez több, mint amit a beállítások vagy jogosultságok engednek: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Állítsa be a maximális csapatméretet egy játékos [prefix_island]-jára (0 a világ alapértelmezésre állításhoz) + success: 'Beállítva [name] [prefix_island] maximális csapatmérete: [number].' + reset: 'Visszaállítva [name] [prefix_island] maximális csapatmérete a világ alapértelmezésre ([number]).' range: description: Admin [prefix_island] tartományának parancsa invalid-value: @@ -229,25 +229,25 @@ commands: description: Beállítja a [prefix_island] védelmi tartományát success: 'A [prefix_island] védelmi tartományának beállítása [number]-ra/re.' reset: - parameters: + parameters: description: >- visszaállítja a [prefix_island] védett tartományát a világ alapértelmezett értékére success: 'Szigetvédelmi tartomány visszaállítása erre: [number].' add: description: növeli a [prefix_island] védett tartományát - parameters: + parameters: success: >- Sikeresen megnöveltük [name][prefix_island] védett tartományát [total] -re (+[number]). remove: description: csökkenti a [prefix_island] védett tartományát - parameters: + parameters: success: >- Sikeresen csökkentette [name][prefix_island] védett tartományát [total] -re (-[number]). register: - parameters: + parameters: description: regisztrálj játékost egy ismeretlen szigetre, amelyen tartózkodsz registered-island: '[name] regisztrálva a [xyz] szigetre.' reserved-island: 'fenntartott [prefix_island] a [xyz] címen a [name] számára.' @@ -273,7 +273,7 @@ commands: A játékosnak több [prefix_island] van. Kérlek, jelöld meg, melyiket. info: - parameters: + parameters: description: információkat kaphat a tartózkodási helyéről vagy a játékos szigetéről no-island: 'Jelenleg nem vagy szigeten...' title: '========== [prefix_Island] információ ============' @@ -313,7 +313,7 @@ commands: removing: 'Védelem megkerülésének eltávolítása...' adding: 'Védelem bypass hozzáadása...' switchto: - parameters: + parameters: description: váltsd át a játékos szigetét a kukában lévő számozottra out-of-range: >- A számnak 1 és [number] között kell lennie. A szigetszámok @@ -330,10 +330,10 @@ commands: title: '=========== [prefix_Island]ek a kukában ===========' count: 'Island [number]:' use-switch: >- - Használja az [label] kapcsolót a gombbal a - lejátszót a kukában lévő szigetre válthatja + Használja az [label] kapcsolót a gombbal a + játékost a kukában lévő szigetre válthatja use-emptytrash: >- - Az [label] ürestrash [lejátszó]használatával véglegesen + Az [label] ürestrash [játékos]használatával véglegesen eltávolíthatja a kukát emptytrash: parameters: '[játékos]' @@ -344,7 +344,7 @@ commands: version: description: megjeleníti a BentoBox és a kiegészítők verzióit setrange: - parameters: + parameters: description: állítsa be a játékos szigetének hatótávolságát range-updated: 'Szigettartomány frissítve a következőre: [number].' placeholders: @@ -356,7 +356,7 @@ commands: reload: description: újratölteni tp: - parameters: [teleportálandó lejátszó] + parameters: [teleportálandó játékos] description: teleportálni egy játékos szigetére manual: >- Nem található biztonságos vetemedés! Manuálisan lépjen a @@ -395,15 +395,15 @@ commands: description: állíts be egy szigetet spawnként ehhez a játékmódhoz already-spawn: 'Ez a [prefix_island] már spawn!' no-island-here: 'Itt nincs [prefix_island].' - confirmation: 'Biztos, hogy ezt a szigetet kívánja beállítani a világ ivadékává?' - success: 'Sikeresen beállította ezt a szigetet a világ ivadékává.' + confirmation: 'Biztos, hogy ezt a szigetet kívánja beállítani spawn szigetként?' + success: 'Sikeresen beállította ezt a szigetet spawn szigetként.' setspawnpoint: - description: állítsa be az aktuális helyet a [prefix_island] ívási pontjaként + description: állítsa be az aktuális helyet a [prefix_island] spawn pontjaként no-island-here: 'Itt nincs [prefix_island].' confirmation: >- - Biztos benne, hogy ezt a helyet szeretné beállítani a [prefix_island] ívási + Biztos benne, hogy ezt a helyet szeretné beállítani a [prefix_island] spawn pontjaként? - success: 'Sikeresen beállította ezt a helyet a [prefix_island] ívási pontjaként.' + success: 'Sikeresen beállította ezt a helyet a [prefix_island] spawn pontjaként.' island-spawnpoint-changed: '[user] megváltoztatta a [prefix_island] spawn pontot.' settings: parameters: '[player]/[world flag]/spawn-island [flag/active/disable] [rank/active/disable]' @@ -567,16 +567,16 @@ commands: world: description: Világbeállítások kezelése delete: - parameters: + parameters: description: törli a játékos szigetét cannot-delete-owner: 'A [prefix_island] összes tagját ki kell rúgni a szigetről, mielőtt törli.' deleted-island: '[prefix_island] itt: [xyz] sikeresen törölve.' deletehomes: - parameters: + parameters: description: törli az összes elnevezett otthont egy szigetről warning: 'Az összes megnevezett otthon törlésre kerül a szigetről!' why: - parameters: + parameters: description: konzolvédelem hibakeresési jelentések váltása turning-on: 'Konzolhibakeresés bekapcsolása [name] számára.' turning-off: 'A konzolhibakeresés kikapcsolása [name] esetén.' @@ -584,7 +584,7 @@ commands: description: Szerkessze a játékosok halálát reset: description: visszaállítja a játékos halálát - parameters: + parameters: success: 'Sikeresen visszaállította [name]halálát 0értékre.' set: description: beállítja a játékos halálát @@ -735,7 +735,7 @@ commands: description: sorolja fel otthonait info: description: információk megjelenítése a szigetről vagy a játékos szigetéről - parameters: + parameters: near: description: mutasd meg a körülötted lévő szomszédos [prefix_islands] nevét parameters: '' @@ -773,8 +773,8 @@ commands: home-list-syntax: '[name]' click-to-teleport: 'Kattints a teleportáláshoz!' nether: - not-allowed: 'Nem állíthatja be otthonát a Hollandiában.' - confirmation: 'Biztos, hogy Hollandiába szeretné helyezni otthonát?' + not-allowed: 'Nem állíthatja be otthonát a Pokolban.' + confirmation: 'Biztos, hogy a Pokolba szeretné helyezni otthonát?' the-end: not-allowed: 'Nem állíthatja be otthonát a végén.' confirmation: 'Biztos benne, hogy a végére akarja állítani az otthonát?' @@ -851,7 +851,7 @@ commands: generic: '[rank] ([number]):' coop: description: alakíts ki játékosszövetségi rangot a szigeteden - parameters: + parameters: cannot-coop-yourself: 'Nem tudod összefogni magad!' already-has-rank: 'A játékosnak már van rangja!' you-are-a-coop-member: 'Önt [name]segítette.' @@ -861,10 +861,10 @@ commands: tagjává. uncoop: description: távolítsa el a coop rangot a játékosból - parameters: + parameters: cannot-uncoop-yourself: 'Nem tudod kiszabadítani magad!' cannot-uncoop-member: 'A csapattagokat nem lehet kibontani!' - player-not-cooped: 'A lejátszó nincs összefogva!' + player-not-cooped: 'A játékos nincs kooperálva!' you-are-no-longer-a-coop-member: 'Ön már nem tagja [name] szigetének.' all-members-logged-off: >- A [prefix_island] összes tagja kijelentkezett, így Ön többé nem tagja [name] @@ -873,7 +873,7 @@ commands: is-full: 'Nem tud együttműködni senki mással.' trust: description: adj egy játékosnak megbízható rangot a szigeteden - parameters: + parameters: trust-in-yourself: 'Bízz magadban!' name-has-invited-you: >- [name] meghívott téged, hogy csatlakozz a szigetük megbízható @@ -884,7 +884,7 @@ commands: is-full: 'Nem bízhatsz másban. Vigyázz magadra!' untrust: description: távolítsa el a megbízható játékos rangját a játékosból - parameters: + parameters: cannot-untrust-yourself: 'Nem bízhatsz magadban!' cannot-untrust-member: 'Nem bízhatsz meg egy csapattagban!' player-not-trusted: 'Az Player nem megbízható!' @@ -932,7 +932,7 @@ commands: already-on-team: 'Az a játékos már tagja a csapatnak!' invalid-invite: 'Ez a meghívó már nem érvényes, sajnálom.' you-have-already-invited: 'Már meghívtad azt a játékost!' - parameters: + parameters: you-can-invite: 'Meghívhat [number] további játékost.' accept: description: fogadja el a meghívást @@ -958,14 +958,14 @@ commands: success: 'Elhagytad ezt a szigetet.' kick: description: távolíts el egy tagot a szigetedről - parameters: + parameters: player-kicked: 'A [name] kirúgott a szigetről [gamemode]-ban!' - cannot-kick: 'Nem rúghatod meg magad!' + cannot-kick: 'Nem rúghatod ki magad!' cannot-kick-rank: 'A rangod nem teszi lehetővé [name] rúgását!' success: '[name] -t kirúgták a szigetedről.' demote: description: lefokozz egy játékost a szigeteden egy ranggal lejjebb - parameters: + parameters: errors: cant-demote-yourself: 'Nem lefokozhatod magad!' cant-demote: 'Magasabb rangokat nem lehet lefokozni!' @@ -974,9 +974,9 @@ commands: success: '[name] lefokozva [rank]' promote: description: előléptessen egy játékost a szigeten egy rangot feljebb - parameters: + parameters: errors: - cant-promote-yourself: 'Nem reklámozhatod magad!' + cant-promote-yourself: 'Nem léptetheted elő magad!' cant-promote: 'Nem léphetsz a rangod fölé!' must-be-member: 'A játékosnak [prefix_an-island] tagnak kell lennie!' failure: 'A játékos nem léptethető tovább!' @@ -991,14 +991,14 @@ commands: target-is-not-member: 'Az a játékos nem tagja a szigeti csapatodnak!' at-max: 'Ennek a játékosnak már van a megengedett maximális számú szigete!' name-is-the-owner: '[name] mostantól a [prefix_island] tulajdonosa!' - parameters: + parameters: you-are-the-owner: 'Mostantól Ön a [prefix_island] tulajdonosa!' ban: description: kitilts egy játékost a szigetedről - parameters: + parameters: cannot-ban-yourself: 'Nem tilthatod ki magad!' cannot-ban: 'Ezt a játékost nem lehet kitiltani.' - cannot-ban-member: 'Először rúgd meg a csapattagot, majd tiltsd ki.' + cannot-ban-member: 'Először rúgd ki a csapattagot, majd tiltsd ki.' cannot-ban-more-players: >- Elérted a kitiltási határt, nem tilthatsz ki több játékost a szigetedről. @@ -1008,11 +1008,11 @@ commands: you-are-banned: 'Ki vagy tiltva erről a szigetről!' unban: description: tiltson le egy játékost a szigetéről - parameters: + parameters: cannot-unban-yourself: 'Nem oldhatod fel magad!' player-not-banned: 'Player nincs kitiltva.' - player-unbanned: '[name]ki van tiltva a szigetedről.' - you-are-unbanned: '[name]kitiltotta a szigetükről!' + player-unbanned: '[name] kitiltása feloldva a szigetedről.' + you-are-unbanned: '[name] feloldotta a kitiltásodat a szigetükről!' banlist: description: listás eltiltott játékosok noone: 'Senki sincs kitiltva ezen a szigeten.' @@ -1028,7 +1028,7 @@ commands: already-selected: 'Már használja ezt a nyelvet.' expel: description: űzz ki egy játékost a szigetedről - parameters: + parameters: cannot-expel-yourself: 'Nem utasíthatod ki magad!' cannot-expel: 'Ezt a játékost nem lehet kizárni.' cannot-expel-member: 'Csapattagot nem zárhatsz ki!' @@ -1058,18 +1058,18 @@ protection: description: Engedélyezze az Allay és Copper Golem számára tárgyak átadását és elvitelét hint: Allay és Copper Golem interakció letiltva ANIMAL_NATURAL_SPAWN: - description: Természetes állati ívás átváltása - name: Állati természetes ívás + description: Természetes állat megjelenés váltása + name: Állatok természetes megjelenése ANIMAL_SPAWNERS_SPAWN: - description: Állatok ívásának átkapcsolása ívókkal - name: Állati ívók + description: Állatok megjelenésének átkapcsolása spawnerekkel + name: Állat spawnerek ANVIL: description: Interakció váltása name: Üllők hint: Üllőhasználat letiltva ARMOR_STAND: description: Interakció váltása - name: Páncél áll + name: Páncélállvány hint: Páncélállvány használat letiltva AXOLOTL_SCOOPING: name: Axolotl kiemelése @@ -1077,8 +1077,8 @@ protection: hint: Az Axolotl kaparászása le van tiltva BEACON: description: Interakció váltása - name: Fáklyák - hint: Beacon használat letiltva + name: Jeladók + hint: Jeladó használat letiltva BELL_RINGING: description: Kapcsolja be a kölcsönhatást name: Engedélyezd a harang zúgását @@ -1162,7 +1162,7 @@ protection: A ládákkal való interakció váltása és láda aknakocsik. (nem tartalmazza a beszorult ládákat) - hint: A mellkasi hozzáférés letiltva + hint: A láda hozzáférés letiltva BARREL: name: Hordók description: A hordó interakciójának váltása @@ -1211,9 +1211,9 @@ protection: description: Használat váltása hint: Kővágás hozzáférés letiltva TRAPPED_CHEST: - name: Csapdába esett ládák - description: Csapdába esett mellkas interakció váltása - hint: A beszorult mellkashoz való hozzáférés letiltva + name: Csapdás ládák + description: Csapdás láda interakció váltása + hint: A csapdás láda hozzáférés letiltva DISPENSER: name: Adagolók description: Az adagoló interakciójának váltása @@ -1231,8 +1231,8 @@ protection: description: Kapcsolja be a garat interakcióját hint: A garat interakciója letiltva CHEST_DAMAGE: - description: Kapcsolja be a robbanás okozta mellkasi sérülést - name: Mellkasi sérülés + description: Kapcsolja be a robbanás okozta ládasérülést + name: Ládasérülés CHORUS_FRUIT: description: Teleportáció váltása name: Kórus gyümölcsei @@ -1242,7 +1242,7 @@ protection: Bármelyik tisztítás engedélyezése szuperlapos darabok bekerülnek szigetvilágok - name: Tiszta szuper lakás + name: Szuperlapos terep tisztítás COARSE_DIRT_TILLING: description: |- A durva művelés váltása @@ -1276,17 +1276,17 @@ protection: name: Munkapadok hint: A munkaasztalhoz való hozzáférés letiltva CREEPER_DAMAGE: - description: | - Toggle kúszónövény - & sérülés elleni védelem - name: Kúszónövény sérülés elleni védelem + description: |- + Creeper sebzés elleni + védelem váltása + name: Creeper sebzés elleni védelem CREEPER_GRIEFING: - description: | - Kúszónövény gyászának váltása - &védelem gyújtáskor + description: |- + Creeper rombolás elleni + védelem váltása szigetlátogató által. - name: Kúszónövény gyászvédelem - hint: Kúszónövény bánat letiltva + name: Creeper rombolás elleni védelem + hint: Creeper rombolás letiltva CROP_PLANTING: description: 'Készlet, aki tud magokat ültetni.' name: Növényültetés @@ -1333,7 +1333,7 @@ protection: description: |- Endermen eltávolíthatja háztömbnyire a szigetektől - name: Enderman gyászol + name: Enderman rombolás ENDERMAN_TELEPORT: description: |- Endermenek tudnak teleportálni @@ -1375,9 +1375,9 @@ protection: Kapcsolja be, hogy a tűz továbbterjedhet-e a közeli blokkokra vagy sem. FISH_SCOOPING: - name: Horgászás - description: Engedje meg a halak kanalazását egy vödör segítségével - hint: A halkaparás letiltva + name: Hal befogás vödörrel + description: Engedje meg a halak vödörrel való befogását + hint: Hal befogás vödörrel letiltva FLINT_AND_STEEL: name: kovakő és acél description: |- @@ -1395,7 +1395,7 @@ protection: hint: Kapuhasználat letiltva GEO_LIMIT_MOBS: description: |- - Távolítsa el a menő csőcseléket + Távolítsa el a mobokat kívülről védett szigettér name: 'Korlátozza a mobokat a szigetre' @@ -1420,26 +1420,26 @@ protection: HURT_ANIMALS: description: Fájdalom váltása name: Bántott állatok - hint: Állatsérülés fogyatékos + hint: Állatsebzés letiltva HURT_MONSTERS: description: Fájdalom váltása name: Bánt szörnyek - hint: Szörnyeteg bántó mozgáskorlátozott + hint: Szörny sebzés letiltva HURT_VILLAGERS: description: Fájdalom váltása name: Bántotta a falusiakat - hint: Falusi lakos sérült + hint: Falusi sebzés letiltva ITEM_FRAME: - name: Elem keret + name: Tárgykeret description: |- Interakció váltása. Felülbírálja a hely- vagy törésblokkokat - hint: Elem Kerethasználat letiltva + hint: Tárgykeret használat letiltva ITEM_FRAME_DAMAGE: description: |- - A csőcselék kárt okozhat - elemkeretek - name: Tétel Keret sérülés + A mobok kárt okozhatnak + tárgykeretekben + name: Tárgykeret sérülés INVINCIBLE_VISITORS: description: |- Legyőzhetetlen látogató konfigurálása @@ -1453,12 +1453,12 @@ protection: name: '[prefix_Island] újraszületése' ITEM_DROP: description: Ledobás váltása - name: Elemesés - hint: Az elem eldobása letiltva + name: Tárgy eldobás + hint: A tárgy eldobása letiltva ITEM_PICKUP: description: Felvétel váltása - name: Tétel átvétel - hint: Elemfelvétel letiltva + name: Tárgy felvétel + hint: Tárgy felvétel letiltva JUKEBOX: description: Használat váltása name: Jukebox használat @@ -1488,9 +1488,9 @@ protection: LIMIT_MOBS: description: |- Entitások korlátozása innen - ívás ebben a játékban + megjelenés ebben a játékban mód. - name: 'Entitástípus spawning korlátozása' + name: 'Entitástípus megjelenés korlátozása' can: 'Lehet spawn' cannot: 'Nem lehet spawn' LIQUIDS_FLOWING_OUT: @@ -1526,19 +1526,19 @@ protection: MILKING: description: Tehénfejés váltása name: Fejés - hint: Fejőtehén fogyatékos + hint: Fejés letiltva MINECART: - name: Minecars + name: Bányakocsik description: |- Váltó elhelyezés, törés és beszállás az aknakocsikba. hint: A Minecart interakció letiltva MONSTER_NATURAL_SPAWN: - description: Kapcsolja be a természetes szörnyek ívását + description: Kapcsolja be a természetes szörny megjelenést name: Szörny természetes spawn MONSTER_SPAWNERS_SPAWN: - description: Váltsd át a szörnyszedést a spawnerekkel - name: Szörnyek ívói + description: Váltsd át a szörny megjelenést spawnerekkel + name: Szörny spawnerek MOUNT_INVENTORY: description: |- Kapcsolja be a hozzáférést @@ -1654,16 +1654,16 @@ protection: PVP_NETHER: description: |- PVP engedélyezése/letiltása - a Hollandiában. - name: Nem PVP - hint: A PVP letiltva a Hollandiában + a Pokolban. + name: Pokol PVP + hint: A PVP letiltva a Pokolban enabled: 'A PVP a Netherben engedélyezve van.' disabled: 'A PVP in the Nether le van tiltva.' PVP_OVERWORLD: description: |- PVP engedélyezése/letiltása a szigeten. - name: Overworl PVP + name: Overworld PVP hint: 'PVP letiltva a Overworldben' enabled: 'A Overworld PVP-je engedélyezve van.' disabled: 'A PVP a Overworldben le van tiltva.' @@ -1780,12 +1780,12 @@ protection: [prefix_Island] tagjai továbbra is elveszítik tárgyaikat ha a saját szigetükön halnak meg! SPAWN_PROTECTION: - name: Spawn island void protection + name: Spawn sziget üresség elleni védelem description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Ha engedélyezve van, a játékosok, akik + beleesnek az ürességbe a spawn szigeten, + visszakerülnek a spawn pontra + ahelyett, hogy meghalnának. RAID_TRIGGER: name: Rajtaütés indítása description: Beállítja a rajtaütés indításához szükséges minimális szigetrangot @@ -1804,10 +1804,10 @@ protection: használhatnak széltölteteket ezen a szigeten. hint: Széltöltet használata letiltva WITHER_DAMAGE: - name: Kapcsolja be a fonáskárosodást + name: Wither sebzés description: |- - Ha aktív, a mar képes - sebzés blokkok és játékosok + Ha aktív, a Wither képes + blokkokat és játékosokat sebezni WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Bed & Respawn horgonyok engedélyezése @@ -2061,26 +2061,26 @@ catalog: a konfigurációt, vagy próbálja újra később. enums: DamageCause: - CONTACT: Kapcsolatba lépni + CONTACT: Érintkezés ENTITY_ATTACK: Mob Támadás ENTITY_SWEEP_ATTACK: Söprő Támadás PROJECTILE: Lövedék SUFFOCATION: Fulladás - FALL: Esik + FALL: Esés FIRE: Tűz FIRE_TICK: Égő - MELTING: Olvasztó + MELTING: Olvadás LAVA: Láva DROWNING: Fulladás BLOCK_EXPLOSION: Blokk robbanás ENTITY_EXPLOSION: Entitás robbanás - VOID: Üres + VOID: Üresség LIGHTNING: Villám SUICIDE: Öngyilkosság STARVATION: Éhezés POISON: Méreg MAGIC: varázslat - WITHER: Elhervad + WITHER: Wither FALLING_BLOCK: Leeső blokk THORNS: Tövis DRAGON_BREATH: Sárkánylehellet From e0645643fdf16781871d757688796465ed5904a5 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:17:49 -0700 Subject: [PATCH 13/95] Fix Japanese (ja.yml) locale: translate untranslated strings, fix mistranslations, broken tags, and placeholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English in maxsize section and SPAWN_PROTECTION flag - Fix broken legacy color codes (&ア, &ピ) in FLINT_AND_STEEL and HARVEST descriptions - Fix translated placeholders ([番号],[名前],[合計]) back to English ([number],[name],[total]) - Fix mistranslations: 成否->成功 (success), 生協->協力者 (coop rank), 産卵->スポーン (spawn), 無効->奈落 (VOID DamageCause), 一夜漬け->押し潰し (CRAMMING), 世界国境->ワールドボーダー, 衝突->接触ダメージ (CONTACT), 終わり->ジ・エンド (the-end), ウーバーイーツ->ウーパールーパー - Fix WITHER_DAMAGE name from generic 許可/禁止 to ウィザーダメージの切り替え - Fix Copper Golem left untranslated in ALLAY flag - Fix CRAFTER hint left in English - Translate reset-to-default panel name - Fix missing tags on OFFLINE_REDSTONE, VISITOR_KEEP_INVENTORY, ENTITY_PORTAL_TELEPORT - Fix 所有->未所有 (unowned), stray space in 訪問 者, various 協同組合/生協 references - Fix ITEM_FRAME description with missing tag and untranslated Toggle Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ja.yml | 132 +++++++++++++++--------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/main/resources/locales/ja.yml b/src/main/resources/locales/ja.yml index dd0921984..afaa3a039 100644 --- a/src/main/resources/locales/ja.yml +++ b/src/main/resources/locales/ja.yml @@ -11,7 +11,7 @@ prefixes: an-island: 島 islands: 島 general: - success: '成否' + success: '成功!' invalid: 無効 beta: 'このコマンドはベータ版です。バックアップがあることを確認してください!' errors: @@ -41,7 +41,7 @@ general: worlds: overworld: オーバーワールド nether: ネザー - the-end: 終わり + the-end: ジ・エンド commands: help: header: '=========== [label]の ヘルプ ===========' @@ -79,11 +79,11 @@ commands: add: description: このプレイヤーの島リセット数を追加します parameters: <プレーヤー> <リセット> - success: '[number]resetsを[name]に追加し、合計を[total]resetsに増やしました。' + success: '[number]回のリセットを[name]に追加し、合計を[total]回に増やしました。' remove: description: プレイヤーの島のリセット回数を減らします parameters: <プレーヤー> <リセット> - success: '[番号] リセットが [名前] の島から正常に削除され、合計が [合計]リセットに減少しました。' + success: '[number] リセットが [name] の島から正常に削除され、合計が [total]リセットに減少しました。' purge: parameters: '[日]' description: '[日]以上放棄された島をパージする' @@ -139,7 +139,7 @@ commands: fix: description: データベース内のクロスアイランドメンバーシップをスキャンして修正 scanning: データベースをスキャンしています... - duplicate-owner: 'プレイヤーはデータベース内に複数の島を所有しています: [名前]' + duplicate-owner: 'プレイヤーはデータベース内に複数の島を所有しています: [name]' player-has: 'プレイヤー[name]には[number]の島があります' duplicate-member: 'プレーヤー[name]はデータベース内の複数の島のメンバーです' rank-on-island: '[rank]島の[xyz]' @@ -162,10 +162,10 @@ commands: success: '[name]がこの島の所有者になりました。' extra-islands: '警告:このプレーヤーは現在、[number]島を所有しています。これは、設定またはパーマで許可されている以上のものです:[max]。' maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: <プレイヤー> <サイズ> + description: プレイヤーの[prefix_island]の最大チームサイズを設定する(0でワールドデフォルトにリセット) + success: '[name]の[prefix_island]の最大チームサイズを[number]に設定しました。' + reset: '[name]の[prefix_island]の最大チームサイズをワールドデフォルト([number])にリセットしました。' range: description: 管理島の範囲コマンド invalid-value: @@ -227,7 +227,7 @@ commands: last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: '死亡: [number]' resets-left: 'リセット: [number] (最大: [total])' - max-homes: Max Homes:[number] + max-homes: '最大ホーム数: [number]' team-members-title: チームメンバー team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -244,10 +244,10 @@ commands: purge-protected: 島はパージ保護されています max-protection-range: 最大の歴史的保護範囲:[range] protection-coords: '保護座標: [xz1] - [xz2]' - is-spawn: 島は産卵の島です - banned-players: 禁止選手 + is-spawn: この島はスポーン島です + banned-players: BAN済みプレイヤー banned-format: '[name]' - unowned: 所有 + unowned: 未所有 bundle: '島の作成に使用される青写真バンドル:[name]' switch: description: 保護バイパスのオン/オフを切り替えます @@ -424,7 +424,7 @@ commands: prompt: 名前を入力するか、「quit」で終了します too-long: '長すぎる' pick-a-unique-name: よりユニークな名前を選んでください - stripped-char-in-unique-name: '一部の文字は許可されていないため削除されました。 新しい ID は [名前]になります。' + stripped-char-in-unique-name: '一部の文字は許可されていないため削除されました。 新しい ID は [name]になります。' success: 成功! conversation-prefix: '>' description: @@ -509,7 +509,7 @@ commands: remove: description: プレイヤーの死を取り除く parameters: <プレイヤー> <死> - success: '[number]deathsを[name]に正常に削除し、合計を[total]deathsに減らしました。' + success: '[number]回の死���を[name]から正常に削除し、合計を[total]回に減らしました。' resetname: description: プレイヤーの島名をリセットする success: '[name] の島名が正常にリセットされました。' @@ -640,7 +640,7 @@ commands: description: 島を再起動し、古いものを削除する parameters: <青写真> none-left: あなたはもうリセットが残っている! - resets-left: '残りには[number]個のresetsがあります' + resets-left: '残りリセット回数は[number]回です' confirmation: |- これを実行してもよろしいですか? すべての島のメンバーは島から追い @@ -737,21 +737,21 @@ commands: coop: description: 島でプレイヤーコープランクを確認 parameters: <プレイヤー> - cannot-coop-yourself: 自分を生協することはできません! + cannot-coop-yourself: 自分を協力メンバーにすることはできません! already-has-rank: プレイヤーはすでにランクを持っている! - you-are-a-coop-member: あなたは [name]に閉じこもっれた + you-are-a-coop-member: あなたは[name]の島の協力メンバーになりました success: '[name]を協力メンバーにしました' name-has-invited-you: '[name] はあなたを彼らの島の協力メンバーとして招待しています。' uncoop: description: プレイヤーから生協のランクを削除する parameters: <プレイヤー> - cannot-uncoop-yourself: 自分にそれを行うことはできません! + cannot-uncoop-yourself: 自分に対してそれを行うことはできません! cannot-uncoop-member: チームメンバーを uncoop ことはできません! - player-not-cooped: プレイヤーは閉じこもっではありません! - you-are-no-longer-a-coop-member: あなたはもはや[name]の島の生協のメンバーではない - all-members-logged-off: 'すべての島のメンバーがログオフしたため、あなたはもはや[name]の島の協同組合員ではありません' - success: '[name]isはもはやあなたの島の協同組合員ではありません。' - is-full: 'これ以上生協メンバーを追加することはできません' + player-not-cooped: プレイヤーは協力メンバーではありません! + you-are-no-longer-a-coop-member: あなたはもう[name]の島の協力メンバーではありません + all-members-logged-off: 'すべての島のメンバーがログオフしたため、あなたはもう[name]の島の協力メンバーではありません' + success: '[name]はもうあなたの島の協力メンバーではありません。' + is-full: 'これ以上協力メンバーを追加することはできません' trust: description: 島でプレイヤーに信頼できるランクを与える parameters: <プレイヤー> @@ -832,7 +832,7 @@ commands: parameters: <プレーヤー> player-kicked: '[gamemode] で [name] によってあなたは島から追い出されました!' cannot-kick: 自分を削除することはできません! - cannot-kick-rank: 'あなたのランクでは [名前] をキックすることはできません!' + cannot-kick-rank: 'あなたのランクでは [name] をキックすることはできません!' success: '[name]はあなたの島から追い出されました。' demote: description: ランクダウンあなたの島のプレーヤーを降格 @@ -873,14 +873,14 @@ commands: owner-banned-you: '[name]は、彼らの島からあなたを禁止!' you-are-banned: あなたはこの島から禁止されています! unban: - description: あなたの島から選手を同時 - parameters: <プレーヤー> - cannot-unban-yourself: 自分を同時ことはできない! + description: プレイヤーの島からのBANを解除する + parameters: <プ��ーヤー> + cannot-unban-yourself: ��分のBAN解除はできません! player-not-banned: プレイヤーは禁止されていません player-unbanned: '[name]は現在、あなたの島から禁止されていません。' you-are-unbanned: '[name]は島からあなたをブロックを解除!' banlist: - description: リスト禁止選手 + description: BAN済みプレイヤーを一覧表示 noone: この島では誰も禁止されていない the-following: 以下の選手は禁止されている names: '[line]' @@ -911,8 +911,8 @@ ranks: sub-owner: サブ所有者 member: メンバー trusted: 信頼 - coop: 生協 - visitor: 訪問 者 + coop: 協力者 + visitor: 訪問者 banned: 禁止 admin: 管理者 mod: モデレーター @@ -920,9 +920,9 @@ protection: command-is-banned: コマンドは、訪問者のために禁止され flags: ALLAY: - name: アレイ・Copper Golem相互作用 - description: Allay と Copper Golem との間でアイテムの授受を許可する - hint: アレイ・Copper Golemインタラクションが無効になっています + name: アレ���・銅のゴーレムの相互作用 + description: アレイと銅のゴーレムとの間でアイテム��授受を許可する + hint: アレ���・銅のゴーレムのインタラクションが無効になっていま��� ANIMAL_NATURAL_SPAWN: description: 自然な動物の産卵を切り替えます name: 動物の自然なスポーン @@ -939,7 +939,7 @@ protection: hint: アーマースタンド使用不可 AXOLOTL_SCOOPING: name: ウーパールートルすくい - description: バケツを使ってウーバーイーツをすくえるようにする + description: バケツを使ってウーパールーパーをすくえるようにする hint: ウーパールーパーすくいが無効になっています BEACON: description: トグル使用 @@ -1030,7 +1030,7 @@ protection: CRAFTER: name: クラフター description: トグルの使用 - hint: Crafter access disabled + hint: クラフターへのアクセスが��効になっています BLOCK_EXPLODE_DAMAGE: description: |- ベッドとリスポーンアンカーを許可する @@ -1230,8 +1230,8 @@ protection: FLINT_AND_STEEL: name: フリントとスチール description: |- - を使用してプレイヤーに火を点ける - &アフリントと鉄鋼または火災料。 + フリン��と鉄鋼または火薬を使用して + プレイヤーが火を点けることを許可する。 hint: フリントとスチールと火のチャージは無効です FURNACE: description: トグル使用 @@ -1249,9 +1249,9 @@ protection: name: '生き物を島に限る' HARVEST: description: |- - 作物を収穫できる人を設定します。 - アイテムを許可することを忘れないでください - &ピックアップも! + 作物を収穫で��る人を設定します。 + アイテムのピックアップも許可する + ことを忘れないでください! name: 作物の収穫 hint: 作物の収穫が無効になっています HIVE: @@ -1277,8 +1277,8 @@ protection: ITEM_FRAME: name: アイテムフレーム description: |- - Toggleインタラクション。 - ブロックの配置または分割をオーバーライドします + インタラクションを切り替えます。 + ブロックの配置または破壊をオーバーライドします。 hint: アイテムフレームの使用は無効です ITEM_FRAME_DAMAGE: description: |- @@ -1411,11 +1411,11 @@ protection: name: オフライン成長 OFFLINE_REDSTONE: description: |- - 無効にすると、レッドストーン - willは島では機能しません - すべてのメンバーがオフラインです。 - Mayは遅延の削減に役立ちます。 - スポーン島には影響しません。 + 無効にすると、すべてのメンバーが + オフラインの場合、レッドストーンは + 島では機能しません。 + 遅延の削減に役立つかもしれません。 + スポーン島には影響しません。 name: オフラインレッドストーン PETS_STAY_AT_HOME: description: |- @@ -1591,15 +1591,15 @@ protection: アイテムと経験値が死亡した場合 彼らが訪問者である島。 - アイランドのメンバーはまだアイテムを失っています - そして、彼らが自分の島で死んだ場合! + 島のメンバーは自分の島で死んだ場合、 + アイテムを失います! SPAWN_PROTECTION: - name: Spawn island void protection + name: スポーン島の奈落保護 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 有効にすると、スポーン島で奈落に + 落ちたプレイヤーは死亡する代わりに + スポーンポイントにテレポート + されま���。 RAID_TRIGGER: name: 襲撃のトリガー description: 襲撃を引き起こすために必要な島の最低ランクを設定します @@ -1607,9 +1607,9 @@ protection: ENTITY_PORTAL_TELEPORT: name: エンティティポータルの使用法 description: |- - エンティティ (非プレイヤー) ができるかどうかを切り替えます。 - ポータルを使用して間をテレポートします - 寸法() + エンティティ(非プレイヤー)が + ポータルを使用してディメンション間を + テレポートできるかどうかを切り替えます。 WIND_CHARGE: name: ウィンドチャージ description: |- @@ -1618,7 +1618,7 @@ protection: ウィンドチャージを使用できません。 hint: ウィンドチャージの使用が無効 WITHER_DAMAGE: - name: 許可/禁止 + name: ウィザーダメージの切り替え description: |- アクティブな場合、枯れます ブロックとプレイヤーを破損 @@ -1654,10 +1654,10 @@ protection: description: '使用可能なすべての設定を表示します。' click-to-switch: 'クリックして[next]に切り替えます。' reset-to-default: - name: 'Reset to default' + name: 'デフォルトにリセット' description: | - ResetsALLthe settings to their - デフォルト値。 + すべての設定をデフォルト値 + にリセットします。 confirm: confirm instructions: '本当にいいですか? "confirm" と入力してすべてをリセットしてください。' PROTECTION: @@ -1854,7 +1854,7 @@ catalog: 設定を変更するか、後で再試行してください。 enums: DamageCause: - CONTACT: 衝突 + CONTACT: 接触ダメージ ENTITY_ATTACK: エンティティ攻撃 ENTITY_SWEEP_ATTACK: エンティティスイープ攻撃 PROJECTILE: 発射物 @@ -1867,7 +1867,7 @@ enums: DROWNING: 溺死 BLOCK_EXPLOSION: ブロック爆発 ENTITY_EXPLOSION: エンティティの爆発 - VOID: 無効 + VOID: 奈落 LIGHTNING: ライトニング SUICIDE: 自殺 STARVATION: 飢餓 @@ -1880,12 +1880,12 @@ enums: CUSTOM: カスタム FLY_INTO_WALL: 壁に飛ぶ HOT_FLOOR: ホットフロア - CRAMMING: 一夜漬け + CRAMMING: 押し潰し DRYOUT: 完全に乾く FREEZE: フリーズ KILL: 殺す SONIC_BOOM: ソニックブーム - WORLD_BORDER: 世界国境 + WORLD_BORDER: ワールドボーダー panel: credits: title: '[name]クレジット' From d93c56204e64777dbae94bc8eb564d66cea3d751 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:18:21 -0700 Subject: [PATCH 14/95] Fix Ukrainian (uk.yml) locale: translate remaining English strings and fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate `maxsize` section (description, success, reset messages) - Translate `SPAWN_PROTECTION` flag name and description - Translate "Placeholder Browser" panel titles to "Браузер замінників" - Fix WITHER_DAMAGE: "вітер-скелета/вітери" (means "wind") to "візера/візери" (correct Minecraft transliteration) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/uk.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/resources/locales/uk.yml b/src/main/resources/locales/uk.yml index 0d8ee8681..9c9559f51 100644 --- a/src/main/resources/locales/uk.yml +++ b/src/main/resources/locales/uk.yml @@ -172,9 +172,9 @@ commands: extra-islands: 'Увага: тепер цей гравець має [number] островів. Це більше ніж дозволено налаштуваннями або пермами: [max].' maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: встановити максимальний розмір команди для [prefix_island] гравця (0 для скидання до типового значення світу) + success: 'Встановлено максимальний розмір команди [prefix_island] гравця [name] на [number].' + reset: 'Скинуто максимальний розмір команди [prefix_island] гравця [name] до типового значення світу ([number]).' range: description: адмін-команда діапазону [prefix_island] invalid-value: @@ -1634,12 +1634,12 @@ protection: Учасники [prefix_Island] все одно втрачають свої предмети на власному [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Захист від порожнечі на спавн-острові description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Якщо ввімкнено, гравці, які впадуть + у порожнечу на спавн-острові, + будуть телепортовані назад на точку + спавну замість смерті. RAID_TRIGGER: name: Запуск рейду description: Встановлює мінімальний ранг острова для запуску рейду @@ -1658,9 +1658,9 @@ protection: використовувати вітрові заряди на цьому острові. hint: Використання вітрових зарядів вимкнено WITHER_DAMAGE: - name: Перемикає шкоду від вітер-скелета + name: Шкода від візера description: |- - Якщо ввімкнено, вітери можуть + Якщо ввімкнено, візери можуть пошкоджувати блоки й гравців WORLD_BLOCK_EXPLODE_DAMAGE: description: |- @@ -1979,7 +1979,7 @@ panels: author: '- [name]' selected: 'Наразі обрано.' placeholder: - title: 'Placeholder Browser' + title: 'Браузер замінників' buttons: bentobox: name: 'BentoBox' @@ -2018,7 +2018,7 @@ panels: description: 'Повернутися до списку аддонів' # The set of common buttons used in multiple panels. placeholder: - title: 'Placeholder Browser' + title: 'Браузер замінників' buttons: bentobox: name: 'BentoBox' From bdc23c1c5dacc3887555aedd28e855130223de88 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:18:28 -0700 Subject: [PATCH 15/95] Fix Croatian (hr.yml) locale: fix broken tags, mistranslations, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English strings: maxsize section, SPAWN_PROTECTION flag - Fix conversation-prefix containing AI response text, replaced with '>' - Fix 12 broken '&' legacy color codes to proper MiniMessage tags - Fix broken [description] placeholder layout entries (pis]) - Fix 12+ translated placeholders that must stay English: [opis]->[description], [datum]->[date], [poruka]->[message], [sekundi]->[seconds], [postavka]->[setting], [redak]->[line], [prikaz]->[display], [tema]->[topic], [instaliraj]->[install], [vrijeme]->[time], [svijetu]->[world], [ime_svijeta]->[world_name], etc. - Fix wrong translations: "mrijest" (fish spawning) -> "spawn"/"pojavljivanje" for spawn points and mob spawning, "Kavez" (cage) -> "Suradnik" for coop rank, "Rafter" -> "Crafter", "Zbor voće" (choir fruit) -> "Chorus voće", "prsni koš" (ribcage) -> "škrinja" for chest damage, "greben" (reef) -> "Wither", "Krajman" -> "Enderman", "mafija" -> "entitet", "metla" (broom) -> "zamah" (sweep) - Fix DamageCause enums: VOID "Poništiti" -> "Praznina", WITHER "uvenuti" -> "Wither", ENTITY_ATTACK "Napad mafije" -> "Napad entiteta", BLOCK_EXPLOSION "Blokiraj" -> "Eksplozija bloka" - Fix missing tags on multi-line descriptions - Fix "Seljanin ozlijeđen invalid" hint text Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/hr.yml | 174 +++++++++++++++--------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/main/resources/locales/hr.yml b/src/main/resources/locales/hr.yml index 54b3a7f41..c1e1d09a1 100644 --- a/src/main/resources/locales/hr.yml +++ b/src/main/resources/locales/hr.yml @@ -11,7 +11,7 @@ prefixes: an-island: otok islands: ostrva general: - success: '&uspjeh!' + success: 'Uspjeh!' invalid: Neispravno beta: 'Ova je naredba u beta verziji. Obavezno imate sigurnosne kopije!' errors: @@ -188,10 +188,10 @@ commands: Upozorenje: ovaj igrač sada posjeduje [number] otoka. To je više od dopuštenog prema postavkama ili dozvolama: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: postavite maksimalnu veličinu tima za igračev [prefix_island] (koristite 0 za vraćanje na zadanu vrijednost svijeta) + success: 'Postavljeno [name] [prefix_island] maksimalna veličina tima na [number].' + reset: 'Vraćeno [name] [prefix_island] maksimalna veličina tima na zadanu vrijednost svijeta ([number]).' range: description: admin island range command invalid-value: @@ -243,7 +243,7 @@ commands: cannot-make-island: >- Ovdje se ne može smjestiti otok, nažalost. Pogledajte konzolu za moguće pogreške. - island-is-spawn: 'Otok je mrijest. Jesi li siguran? Ponovno unesite naredbu za potvrdu.' + island-is-spawn: 'Otok je spawn. Jeste li sigurni? Ponovno unesite naredbu za potvrdu.' unregister: parameters: [x,y,z] description: odjaviti vlasnika s otoka, ali zadržati otočne blokove @@ -259,7 +259,7 @@ commands: title: '========== Informacije o otoku ============' island-uuid: 'UUID: [uuid]' owner: 'Vlasnik: [owner] ([uuid])' - last-login: 'Zadnja prijava: [datum]' + last-login: 'Zadnja prijava: [date]' last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: 'Smrti: [number]' resets-left: 'Poništavanje: [number] (Maksimalno: [total])' @@ -280,7 +280,7 @@ commands: purge-protected: Otok je zaštićen od čišćenja max-protection-range: 'Najveći povijesni raspon zaštite: [range]' protection-coords: 'Koordinate zaštite: [xz1] do [xz2]' - is-spawn: Otok je otok za mrijest + is-spawn: Otok je spawn otok banned-players: 'Zabranjeni igrači:' banned-format: '[name]' unowned: 'Neposjedovan' @@ -361,19 +361,19 @@ commands: xyz-error: 'Navedite tri cjelobrojne koordinate: npr. 100 120 100' setspawn: description: postavite otok kao spawn za ovaj gamemode - already-spawn: 'Ovaj otok je već mrijest!' + already-spawn: 'Ovaj otok je već spawn!' no-island-here: 'Ovdje nema otoka.' confirmation: >- Jeste li sigurni da želite postaviti ovaj otok kao mjesto nastanka ovog svijeta? - success: 'Uspješno postavite ovaj otok kao mrijest za ovaj svijet.' + success: 'Uspješno postavite ovaj otok kao spawn za ovaj svijet.' setspawnpoint: - description: postavite trenutnu lokaciju kao točku mrijesta za ovaj otok + description: postavite trenutnu lokaciju kao spawn točku za ovaj otok no-island-here: 'Ovdje nema otoka.' confirmation: >- Jeste li sigurni da želite postaviti ovu lokaciju kao točku mriještenja za ovaj otok? - success: 'Uspješno postavite ovu lokaciju kao točku mrijesta za ovaj otok.' + success: 'Uspješno postavite ovu lokaciju kao spawn točku za ovaj otok.' island-spawnpoint-changed: '[user] je promijenio točku pojavljivanja otoka.' settings: parameters: >- @@ -389,7 +389,7 @@ commands: file-exists: 'Datoteka već postoji, prepisati?' no-such-file: 'Nema takve datoteke!' could-not-load: 'Nije moguće učitati tu datoteku!' - could-not-save: 'Hmm, nešto nije u redu prilikom spremanja te datoteke: [poruka]' + could-not-save: 'Hmm, nešto nije u redu prilikom spremanja te datoteke: [message]' set-pos1: 'Pozicija 1 postavljena na [vector]' set-pos2: 'Položaj 2 postavljen na [vector]' set-different-pos: 'Postavite drugu lokaciju - ova pozicija je već postavljena!' @@ -441,7 +441,7 @@ commands: parameters: description: preimenovati nacrt success: >- - Nacrt [old] je uspješno preimenovan u [prikaz]. Naziv + Nacrt [old] je uspješno preimenovan u [display]. Naziv datoteke sada je [name]. pick-different-name: 'Navedite naziv koji se razlikuje od trenutnog naziva nacrta.' management: @@ -482,7 +482,7 @@ commands: Neki su znakovi uklonjeni jer nisu dopušteni. Novi ID će biti [name]. success: Uspjeh! - conversation-prefix: Sure, please provide the text you would like translated to Croatian. + conversation-prefix: '>' description: quit: prestati instructions: | @@ -622,7 +622,7 @@ commands: players: '[prefix_bentobox]Migracija igrača' names: '[prefix_bentobox]Premještanje imena' addons: '[prefix_bentobox]Migrirajući dodaci' - class: '[prefix_bentobox]Migracija [opis]' + class: '[prefix_bentobox]Migracija [description]' migrated: '[prefix_bentobox]Migrirano' completed: '[prefix_bentobox]Završeno' rank: @@ -638,7 +638,7 @@ commands: failure: 'Neuspješno uklanjanje [rank]. Nepoznata titula.' list: 'Registrirane rangove su sljedeće:' confirmation: - confirm: 'Ponovno upišite naredbu unutar [sekundi]sza potvrdu.' + confirm: 'Ponovno upišite naredbu unutar [seconds]sza potvrdu.' previous-request-cancelled: 'Prethodni zahtjev za potvrdu otkazan.' request-cancelled: 'Istek potvrde - zahtjev otkazan.' delay: @@ -661,8 +661,8 @@ commands: help: description: glavna otočka komanda spawn: - description: teleportirati vas u mrijest - teleporting: 'Teleportira vas u mrijest.' + description: teleportirati vas na spawn + teleporting: 'Teleportira vas na spawn.' no-spawn: 'U ovom modu igre nema spawn-a.' create: description: stvorite otok, koristeći izborni nacrt (zahtijeva dopuštenje) @@ -682,7 +682,7 @@ commands: estimated-time: 'Procijenjeno vrijeme: [number] sekundi.' blocks: 'Izgradnja blok po blok: [number] blokova u svim...' entities: 'Popunjavanje entitetima: [number] entiteta u svim...' - dimension-done: 'otok u [svijetu] je izgrađen.' + dimension-done: 'otok u [world] je izgrađen.' done: 'Gotovo! Vaš otok je spreman i čeka vas!' pick: 'Odaberite otok' cannot-afford: 'Ne možete si to priuštiti! Cijena: [cost]' @@ -791,7 +791,7 @@ commands: description: prikazati detaljne informacije o vašem timu member-layout: online: 'o [name]' - offline: 'o [name] ([posljednje_viđeno])' + offline: 'o [name] ([last_seen])' offline-not-last-seen: 'o [name]' last-seen: layout: '[number] [unit] prije' @@ -972,7 +972,7 @@ commands: description: popis zabranjenih igrača noone: 'Nitko nije zabranjen na ovom otoku.' the-following: 'Sljedeći igrači su zabranjeni:' - names: '[redak]' + names: '[line]' you-can-ban: 'Možete zabraniti do [number] više igrača.' settings: description: prikaz postavki otoka @@ -1000,7 +1000,7 @@ ranks: sub-owner: Podvlasnik member: Član trusted: Pouzdan - coop: Kavez + coop: Suradnik visitor: Posjetitelj banned: zabranjeno admin: Administrator @@ -1014,10 +1014,10 @@ protection: hint: Interakcija Allay i Copper Golem onemogućena ANIMAL_NATURAL_SPAWN: description: Uključi/isključi prirodno mriještenje životinja - name: Prirodni mrijest životinja + name: Prirodno pojavljivanje životinja ANIMAL_SPAWNERS_SPAWN: - description: Prebacivanje mriještenja životinja pomoću mrijesta - name: Mrijest životinja + description: Prebacivanje pojavljivanja životinja pomoću spawnera + name: Spawner životinja ANVIL: description: Uključi/isključi interakciju name: Nakovnji @@ -1103,10 +1103,10 @@ protection: description: |- Prebaci interakciju sa svim spremnicima. Uključuje: bačvu, pčelinju košnicu, stalak za kuhanje, - & škrinja, komposter, dozator, kapaljka, - & teglica za cvijeće, peć, spremnik, okvir predmeta, - & jukebox, škrinja s kolicima, kutija za šulkere, - &zarobljena škrinja. + škrinja, komposter, dozator, kapaljka, + teglica za cvijeće, peć, spremnik, okvir predmeta, + jukebox, škrinja s kolicima, kutija za šulkere, + zarobljena škrinja. Promjena pojedinačnih postavki nadjačava ovu zastavu. @@ -1123,7 +1123,7 @@ protection: description: Uključivanje interakcije bačve hint: Pristup bačvi onemogućen CRAFTER: - name: Rafter + name: Crafter description: Upotreba prebacivanja hint: Crafter pristup onemogućen BLOCK_EXPLODE_DAMAGE: @@ -1187,10 +1187,10 @@ protection: hint: Interakcija lijevka onemogućena CHEST_DAMAGE: description: Uključite/isključite oštećenja prsa od eksplozija - name: Oštećenje prsnog koša + name: Oštećenje škrinja CHORUS_FRUIT: description: Uključi/isključi teleportaciju - name: Zbor voće + name: Chorus voće hint: Teleportiranje Chorus voća onemogućeno CLEAN_SUPER_FLAT: description: |- @@ -1233,12 +1233,12 @@ protection: CREEPER_DAMAGE: description: | Preklopni puzavac - & zaštita od oštećenja + zaštita od oštećenja name: Zaštita od oštećenja puzavice CREEPER_GRIEFING: description: | Uključi/isključi žalovanje puzavice - zaštita pri paljenju + zaštita pri paljenju od posjetitelja otoka. name: Creeper griefing zaštita hint: Creeper žalovanje onemogućeno @@ -1283,17 +1283,17 @@ protection: Endermen će pasti bilo koji blok su holding ako je ubijen. - name: Krajmanov pad smrti + name: Enderman ispuštanje pri smrti ENDERMAN_GRIEFING: description: |- Endermen može ukloniti blokova od otoka - name: Enderman tuguje + name: Enderman griefing ENDERMAN_TELEPORT: description: |- Endermen se može teleportirati ako je aktivan. - name: Endermanov teleport + name: Enderman teleportacija ENDER_PEARL: description: Uključi/isključi upotrebu name: EnderBiseri @@ -1307,7 +1307,7 @@ protection: now-leaving: 'Sada napuštam [name].' now-leaving-your-island: 'Sada napuštam vaš otok: [name]' EXPERIENCE_BOTTLE_THROWING: - name: Doživite bacanje boce + name: Bacanje boca iskustva description: Uključi/isključi bacanje boca iskustva. hint: Boce iskustva onemogućene FIRE_BURNING: @@ -1358,7 +1358,7 @@ protection: description: |- Postavite tko može žeti usjeve. Ne zaboravite dopustiti stavku - i preuzimanje također! + i preuzimanje također! name: Berba usjeva hint: Žetva usjeva onemogućena HIVE: @@ -1382,7 +1382,7 @@ protection: HURT_VILLAGERS: description: Prebaci ranjavanje name: Povrijeđeni seljani - hint: Seljanin ozlijeđen invalid + hint: Ranjavanje seljana onemogućeno ITEM_FRAME: name: Okvir predmeta description: |- @@ -1441,7 +1441,7 @@ protection: description: |- Ograniči entitete od spawning u ovoj igri - & način rada. + način rada. name: 'Ograničite stvaranje tipa entiteta' can: 'Može se mrijestiti' cannot: 'Ne može se pojaviti' @@ -1465,7 +1465,7 @@ protection: name: Promijeniti postavke description: |- Dopusti promjenu člana - &uloga može promijeniti postavke otoka. + uloga može promijeniti postavke otoka. MILKING: description: Uključi/isključi mužnju krava name: Mužnja @@ -1478,7 +1478,7 @@ protection: hint: Interakcija s kolicima je onemogućena MONSTER_NATURAL_SPAWN: description: Uključi/isključi pojavu prirodnog čudovišta - name: Čudovišni prirodni mrijest + name: Prirodno pojavljivanje čudovišta MONSTER_SPAWNERS_SPAWN: description: Prebacivanje mriještenja čudovišta pomoću mriještenja name: Mrijesti čudovišta @@ -1536,14 +1536,14 @@ protection: neće poslovati na otocima gdje su svi članovi izvan mreže. Može pomoći u smanjenju kašnjenja. - Ne utječe na otok mrijesta. - name: Offline Crvena kamenčina + Ne utječe na spawn otok. + name: Offline Redstone PETS_STAY_AT_HOME: description: |- Kada je aktivan, pripitomljeni ljubimci može ići samo u i - ne može napustiti vlasnika - odni otok. + ne može napustiti vlasnikov + otok. name: Kućni ljubimci ostaju kod kuće PISTON_PUSH: description: |- @@ -1635,13 +1635,13 @@ protection: hint: Šišanje onemogućeno SPAWN_EGGS: description: Uključi/isključi upotrebu - name: Mrijest jaja - hint: Mrijest jaja onemogućena + name: Spawn jaja + hint: Spawn jaja onemogućena SPAWNER_SPAWN_EGGS: description: |- Omogućuje promjenu vrste entiteta spawnera - pomoću jajašca mrijesta. - name: Mrijest jaja na mrijestionicama + pomoću spawn jaja. + name: Spawn jaja na spawnerima hint: promjena tipa entiteta spawnera korištenjem spawn jaja nije dopuštena SCULK_SENSOR: description: |- @@ -1686,7 +1686,7 @@ protection: name: Drveće raste izvan dometa description: |- Uključivanje/isključivanje može li drveće rasti izvan - Domet zaštite otoka ili ne. + dometa zaštite otoka ili ne. Ne samo da će spriječiti postavljanje sadnica izvan dometa zaštite otoka od raste, ali će također blokirati generaciju @@ -1701,7 +1701,7 @@ protection: name: Frost Walker hint: Frost Walker onemogućen EXPERIENCE_PICKUP: - name: Doživite preuzimanje + name: Preuzimanje iskustva description: Uključi/isključi preuzimanje kugle iskustva hint: Preuzimanje iskustva onemogućeno PREVENT_TELEPORT_WHEN_FALLING: @@ -1718,15 +1718,15 @@ protection: predmeti i iskustvo ako umru na otok na kojem su oni posjetitelji. - Članovi Islanda i dalje gube svoje predmete + Članovi otoka i dalje gube svoje predmete ako umru na vlastitom otoku! SPAWN_PROTECTION: - name: Spawn island void protection + name: Zaštita od praznine na spawn otoku description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Kada je omogućeno, igrači koji padnu + u prazninu na spawn otoku + bit će teleportirani natrag na + točku pojavljivanja umjesto da umru. RAID_TRIGGER: name: Pokretanje racije description: Postavlja minimalni rang otoka potreban za pokretanje racije @@ -1745,9 +1745,9 @@ protection: koristiti vjetrene naboje na ovom otoku. hint: Upotreba vjetrenih naboja onemogućena WITHER_DAMAGE: - name: Prebaci oštećenje venuća + name: Prebaci Wither oštećenje description: |- - Ako je aktivan, greben može + Ako je aktivan, Wither može oštetiti blokove i igrače WORLD_BLOCK_EXPLODE_DAMAGE: description: |- @@ -1763,9 +1763,9 @@ protection: name: Svjetska TNT šteta locked: 'Ovaj otok je zaključan!' locked-island-bypass: 'Ovaj [prefix_island] je zaključan, ali imate dozvolu za pristup.' - protected: 'Otok zaštićen: [opis].' - world-protected: 'Svijet zaštićen: [opis].' - spawn-protected: 'Spawn zaštićeno: [opis].' + protected: 'Otok zaštićen: [description].' + world-protected: 'Svijet zaštićen: [description].' + spawn-protected: 'Spawn zaštićeno: [description].' panel: next: 'Sljedeća stranica' previous: 'Prethodna stranica' @@ -1779,12 +1779,12 @@ protection: expert: name: 'Stručne postavke' description: 'Prikazuje sve dostupne postavke.' - click-to-switch: 'Kliknite za prebacivanje na [sljedeće].' + click-to-switch: 'Kliknite za prebacivanje na [next].' reset-to-default: name: 'Vrati na zadano' description: | Resetira SVE postavke na njihove - &zadana vrijednost. + zadana vrijednost. confirm: potvrdi instructions: 'Jeste li sigurni? Upisite "potvrdi" da biste resetirali sve.' PROTECTION: @@ -1798,15 +1798,15 @@ protection: Opće postavke za ovaj otok WORLD_SETTING: - title: '[ime_svijeta] Postavke' + title: '[world_name] Postavke' description: 'Postavke za ovaj svijet igre' WORLD_DEFAULTS: title: '[world_name] Svjetske zaštite' description: | Postavke zaštite kada - & igrač je izvan svog otoka + igrač je izvan svog otoka flag-item: - name-layout: '&ime]' + name-layout: '[name]' command-instructions: setname: |- Odaberite rang koji može @@ -1860,7 +1860,7 @@ protection: Odaberite rang koji može koristiti naredbu za granicu description-layout: | - pis] + [description] Lijevi klik za kretanje prema dolje. Desni klik za kretanje prema gore. @@ -1870,16 +1870,16 @@ protection: blocked-rank: '- [rank]' minimal-rank: '- [rank]' menu-layout: | - pis] + [description] Kliknite za otvaranje. setting-cooldown: 'Postavka je na hlađenju' setting-layout: | - pis] + [description] Kliknite za prebacivanje. - Trenutna postavka: [postavka] + Trenutna postavka: [setting] setting-active: 'Aktivan' setting-disabled: 'Onemogućeno' management: @@ -1895,7 +1895,7 @@ management: gamemode: name: '[name]' description: | - Otoci: [otoci] + Otoci: [islands] addons: name: 'Dodaci' description: 'Kliknite za prikaz trenutno učitanih dodataka' @@ -1973,16 +1973,16 @@ catalog: name: 'Dodaci' description: | Kliknite za pregledavanje - & dostupni službeni dodaci. + dostupni službeni dodaci. icon: description-template: | - [tema] - [instaliraj] + [topic] + [install] - [opis] + [description] Kliknite da biste dobili vezu na - & najnovije izdanje. + najnovije izdanje. already-installed: Već instalirano! install-now: Sada instalirati! empty-here: @@ -1995,8 +1995,8 @@ catalog: enums: DamageCause: CONTACT: Kontakt - ENTITY_ATTACK: Napad mafije - ENTITY_SWEEP_ATTACK: Napad s metlom + ENTITY_ATTACK: Napad entiteta + ENTITY_SWEEP_ATTACK: Zamašni napad PROJECTILE: Projektil SUFFOCATION: Gušenje FALL: Pad @@ -2005,15 +2005,15 @@ enums: MELTING: Topljenje LAVA: Lava DROWNING: Utapanje - BLOCK_EXPLOSION: Blokiraj eksploziju + BLOCK_EXPLOSION: Eksplozija bloka ENTITY_EXPLOSION: Eksplozija entiteta - VOID: Poništiti + VOID: Praznina LIGHTNING: Munja SUICIDE: Samoubojstvo STARVATION: Gladovanje POISON: Otrov - MAGIC: magija - WITHER: uvenuti + MAGIC: Magija + WITHER: Wither FALLING_BLOCK: Padajući blok THORNS: Trnje DRAGON_BREATH: Zmajev dah @@ -2124,4 +2124,4 @@ successfully-loaded: > |_) | ___ _ __ | |_ ___ | |_) | _____ __ 2017. - 2023 | _ < / _ \ '_ \| __/ _ \| _ < / _ \ \/ / | |_) | __/ | | | || (_) | |_) | (_) > < v [version] |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Učitano za - [vrijeme]ms. + [time]ms. From d0fc51410988946cef7122527bcb7b29c2164f2a Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:19:34 -0700 Subject: [PATCH 16/95] Fix Brazilian Portuguese (pt-BR.yml) locale: translate English strings, fix typos and placeholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (parameters, description, success, reset) - Translate SPAWN_PROTECTION flag (name and description) - Translate SETTING panel description from English - Fix conversation-prefix from AI response to '>' - Fix swapped next/previous panel labels - Fix DamageCause FALL: "Outono" (Autumn) -> "Queda" (Fall damage) - Fix DamageCause FLY_INTO_WALL: imperative -> noun form - Translate DamageCause CRAMMING and SONIC_BOOM - Fix PVP_OVERWORLD disabled message saying "Nether" instead of "Overworld" - Fix translated placeholders: [nome]->[name], [ranking]->[rank], [descrição]->[description] - Fix [prefix_Igreja]->[prefix_Island] and [mundo]->[world] in dimension-done - Fix typos: jjogador, Prermitir, Resspawn, desatilitado, nescessária, mebro, dispoível - Fix "desconfiança" (noun) to "remover confiança" (verb) in team-untrust command Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/pt-BR.yml | 70 ++++++++++++++-------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/resources/locales/pt-BR.yml b/src/main/resources/locales/pt-BR.yml index fb53179d5..488e173bc 100644 --- a/src/main/resources/locales/pt-BR.yml +++ b/src/main/resources/locales/pt-BR.yml @@ -185,10 +185,10 @@ commands: Atenção: este jogador agora possui [number] ilhas. Isso é mais do que o permitido pelas configurações ou permissões: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: definir o tamanho máximo da equipe para a [prefix_island] de um jogador (use 0 para redefinir para o padrão do mundo) + success: 'Tamanho máximo da equipe de [name] na [prefix_island] definido para [number].' + reset: 'Tamanho máximo da equipe de [name] na [prefix_island] redefinido para o padrão do mundo ([number]).' range: description: administrar raio das ilhas invalid-value: @@ -264,8 +264,8 @@ commands: resets-left: 'Reinícios: [number] (Máx: [total])' max-homes: 'Max casas: [number]' team-members-title: 'Membros da equipe:' - team-owner-format: '[nome] [rank]' - team-member-format: '[nome] [ranking]' + team-owner-format: '[name] [rank]' + team-member-format: '[name] [rank]' max-team-size: 'Tamanho máximo da equipe: [number]' max-coop-size: 'Tamanho máximo de coop: [number]' max-trusted-size: 'Tamanho máximo de confiança: [number]' @@ -281,7 +281,7 @@ commands: protection-coords: 'Coordenadas da proteção: de [xz1] até [xz2]' is-spawn: Essa ilha é um spawn banned-players: 'Jogadores banidos:' - banned-format: '[nome]' + banned-format: '[name]' unowned: 'Sem dono' bundle: 'Pacote de Blueprint usado para criar a ilha: [name]' switch: @@ -306,7 +306,7 @@ commands: count: 'Ilha [number]:' use-switch: >- Use [label] switchto para trocar a ilha de - um jjogador para uma na lixeira + um jogador para uma na lixeira use-emptytrash: >- Use [label] emptytrash [player]para remover itens da lixeira permanentemente @@ -468,7 +468,7 @@ commands: no-permission: Sem Permissão perm-required: Necessária no-perm-required: Não é possível definir perm para o pacote padrão - perm-not-required: Não nescessária + perm-not-required: Não necessária perm-format: '' remove: Clique com botão direito para apagar blueprint-instruction: | @@ -487,7 +487,7 @@ commands: Alguns caracteres foram removidos porque não são permitidos. O novo ID será [name]. success: Sucesso! - conversation-prefix: Claro! Por favor, forneça o texto que você deseja traduzir. + conversation-prefix: '>' description: quit: sair instructions: | @@ -686,7 +686,7 @@ commands: estimated-time: 'Tempo estimado: [number] segundos.' blocks: 'Construindo bloco por bloco: [number] blocos no total...' entities: 'Colocando as criaturas: [number] criaturas no total...' - dimension-done: '[prefix_Igreja] em [mundo] está construída.' + dimension-done: '[prefix_Island] em [world] está construída.' done: 'Feito! Sua ilha está pronta e esperando por você!' pick: 'Escolha uma ilha' cannot-afford: 'Você não pode pagar isso! Custo: [cost]' @@ -735,7 +735,7 @@ commands: [number] casas. home-set: 'A home de sua ilha foi marcada na sua localização atual.' homes-are: '[prefix_Island] casas são:' - home-list-syntax: '[nome]' + home-list-syntax: '[name]' click-to-teleport: 'Clique para se teletransportar!' nether: not-allowed: 'Você não tem permissão para marcar sua home no Nether.' @@ -848,7 +848,7 @@ commands: description: retirar o cargo de confiável de um jogador parameters: cannot-untrust-yourself: 'Você não pode desconfiar de si mesmo!' - cannot-untrust-member: 'Você não pode desconfiar de um mebro da equipe!' + cannot-untrust-member: 'Você não pode desconfiar de um membro da equipe!' player-not-trusted: 'Esse jogador não é considerado confiável!' you-are-no-longer-trusted: 'Você não é mais um jogador confiável na ilha de [name]!' success: '[name] não é mais um jogador confiável em sua ilha.' @@ -988,7 +988,7 @@ commands: language: description: selecionar idioma parameters: '[idioma]' - not-available: 'Esse idioma não está dispoível.' + not-available: 'Esse idioma não está disponível.' already-selected: 'Você já está usando esse idioma.' expel: description: retirar um jogador da sua ilha @@ -1132,7 +1132,7 @@ protection: hint: Acesso ao artesão desativado BLOCK_EXPLODE_DAMAGE: description: |- - Permitir que Camas & Âncoras de Resspawn + Permitir que Camas & Âncoras de Respawn quebrem blocos e causem dano a entidades. name: Dano de explosão de bloco @@ -1204,7 +1204,7 @@ protection: name: Limpar superplano COARSE_DIRT_TILLING: description: |- - Prermitir obtenção de + Permitir obtenção de terra ao quebrar podzol ou ao arar terra grossa name: Terra grossa @@ -1277,7 +1277,7 @@ protection: ENCHANTING: description: Permitir uso de mesas de encantamento name: Mesas de encantamento - hint: Uso de mesas de encantamento desatilitado + hint: Uso de mesas de encantamento desabilitado ENDER_CHEST: description: Permitir uso/criação name: Baús de Ender @@ -1610,7 +1610,7 @@ protection: name: PVP no Overworld hint: 'PVP desabilitado no Overworld' enabled: 'O PVP no Overworld foi habilitado.' - disabled: 'O PVP no Nether foi desabilitado.' + disabled: 'O PVP no Overworld foi desabilitado.' REDSTONE: description: Permitir uso name: Itens de Redstone @@ -1717,12 +1717,12 @@ protection: Membros de [prefix_Island] ainda perdem seus itens se morrerem em seu próprio [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Proteção contra o vazio na ilha de spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Quando ativado, jogadores que caírem + no vazio na ilha de spawn + serão teleportados de volta ao + ponto de spawn em vez de morrer. RAID_TRIGGER: name: Gatilho de invasão description: Define o rank mínimo de ilha necessário para acionar uma invasão @@ -1747,7 +1747,7 @@ protection: danificar blocos e jogadores WORLD_BLOCK_EXPLODE_DAMAGE: description: |- - Permitir que Camas & Ancoras de Resspawn + Permitir que Camas & Ancoras de Respawn quebrem blocos e causem dano a entidades fora dos limites de [prefix_island]. name: Dano de explosão de bloco do mundo @@ -1762,8 +1762,8 @@ protection: world-protected: 'Mundo protegido: [description].' spawn-protected: 'Spawn protegido: [description].' panel: - next: 'Página anterior' - previous: 'Página seguinte' + next: 'Próxima página' + previous: 'Página anterior' mode: advanced: name: 'Configurações avançadas' @@ -1790,8 +1790,8 @@ protection: SETTING: title: 'Configurações' description: |- - General settings - for this island + Configurações gerais + para esta [prefix_island] WORLD_SETTING: title: 'Configurações de [world_name]' description: 'Configurações para esse mundo de jogo' @@ -1801,7 +1801,7 @@ protection: Configurações de proteção para quando o jogador está fora de sua ilha flag-item: - name-layout: '[nome]' + name-layout: '[name]' command-instructions: setname: |- Selecione o cargo que pode @@ -1832,7 +1832,7 @@ protection: descooperar team-untrust: |- Selecione o cargo que pode - desconfiança + remover confiança team-promote: |- Selecione a classificação que pode promover a classificação do jogador @@ -1990,7 +1990,7 @@ enums: ENTITY_SWEEP_ATTACK: Ataque de Varredura PROJECTILE: Projétil SUFFOCATION: Sufocação - FALL: Outono + FALL: Queda FIRE: Fogo FIRE_TICK: Queimando MELTING: Derretendo @@ -2009,13 +2009,13 @@ enums: THORNS: Espinhos DRAGON_BREATH: Sopro do Dragão CUSTOM: Personalizado - FLY_INTO_WALL: Voe para a parede + FLY_INTO_WALL: Colisão com parede HOT_FLOOR: 'Piso Quente' - CRAMMING: Cramming + CRAMMING: Esmagamento por entidades DRYOUT: Secagem FREEZE: Congelar KILL: Matar - SONIC_BOOM: Sonic Boom + SONIC_BOOM: Explosão Sônica WORLD_BORDER: Limite do Mundo panel: credits: @@ -2041,7 +2041,7 @@ panels: buttons: bundle: name: '[name]' - description: '[descrição]' + description: '[description]' uses: 'Usado [number]/[max]' unlimited: 'Usos ilimitados permitidos' cost: 'Custo: [cost]' From e9e5f554f9b25478adba4ae59b469468c3314763 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:19:44 -0700 Subject: [PATCH 17/95] Fix Polish (pl.yml) locale: translate untranslated sections, fix typos and wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (was entirely English) - Translate SPAWN_PROTECTION flag (was entirely English) - Translate "Placeholder Browser" panel title - Fix name-too-long saying "Too short / Minimum" instead of "Too long / Maximum" - Fix purge completed message saying "cancelled" instead of "completed" - Fix team.fix.done saying "Scan" instead of "Done" - Fix [opis] translated placeholder back to [description] - Fix "purgę" command typo and "Typ" to "Wpisz" - Fix sink translated as "zlew" (kitchen sink) to "tonąć" (submerge) - Fix FISH_SCOOPING: "Łowienie ryb" (fishing) to "Zbieranie ryb wiadrem" (scooping) - Fix BREAK_HOPPERS: broken Polish ("zbijania ich hoppers") to proper translation - Fix BREAK_SPAWNERS: "Złamać spawnerów" (infinitive) to "Łamanie spawnerów" (noun) - Fix resetname description (was broken English word order) - Fix locales description (was "locale[locale]" broken string) - Fix DamageCause enums: WITHER (Zgniatacz->Wither), CUSTOM (Zwyczaj->Niestandardowe), FLY_INTO_WALL (Lecieć->Zderzenie), CRAMMING (untranslated), FREEZE (Zatrzymaj się-> Zamrożenie), KILL (Zabij->Komenda /kill), SONIC_BOOM (untranslated->Fala Uderzeniowa) - Fix Cyrillic "мыши" (Russian) to Polish "myszy" in invite GUI - Fix all duplicate "jest jest" occurrences throughout the file - Fix "zostało jest wyłączone" grammar in PVP disabled messages - Fix PVP_OVERWORLD disabled message color from red to green Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/pl.yml | 118 +++++++++++++++--------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/src/main/resources/locales/pl.yml b/src/main/resources/locales/pl.yml index 4d1e936ab..c172f6add 100644 --- a/src/main/resources/locales/pl.yml +++ b/src/main/resources/locales/pl.yml @@ -119,7 +119,7 @@ commands: total-islands: 'Masz [number] wysp w swojej bazie danych we wszystkich światach.' number-error: 'Argument musi być liczbą dni' confirm: 'Użyj [label] purge confirm, by rozpocząć proces usuwania wysp' - completed: 'Proces usuwania wysp został anulowany.' + completed: 'Proces usuwania wysp został zakończony.' see-console-for-status: >- Rozpoczęto proces czyszczenia wysp. Uruchom konsolę w celu sprawdzenia szczegółowego statusu. @@ -127,7 +127,7 @@ commands: regions: parameters: '[days]' description: Oczyszcz wyspy, usuwając stare pliki regionu - confirm: 'Typ /[label] purgę regions confirm aby rozpocząć czyszczenie' + confirm: 'Wpisz /[label] purge regions confirm aby rozpocząć czyszczenie' protect: description: Przełącz ochronę przed usuwaniem opuszczonych wysp move-to-island: 'Najpierw przenieś się na wyspę!' @@ -170,7 +170,7 @@ commands: bazie danych rank-on-island: '[rangę] na [prefix_island] w [xyz]' fixed: 'Naprawiono' - done: 'Skanuj' + done: 'Gotowe' kick: parameters: description: wyrzuć gracza z drużyny @@ -192,10 +192,10 @@ commands: Uwaga: ten gracz posiada teraz [number] wysp. To więcej niż dozwolone według ustawień lub uprawnień: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Ustaw maksymalny rozmiar drużyny dla [prefix_island] gracza (użyj 0, aby przywrócić domyślne ustawienia świata) + success: 'Ustawiono maksymalny rozmiar drużyny [name] na [prefix_island] na [number].' + reset: 'Zresetowano maksymalny rozmiar drużyny [name] na [prefix_island] do domyślnych ustawień świata ([number]).' range: description: administracyjna komenda obszaru ochrony wysp invalid-value: @@ -414,8 +414,8 @@ commands: sink: description: ustaw ten szablon, aby zanurzył się na dno oceanu po wklejeniu status: 'Plan będzie [status] po wklejeniu' - sink: 'zlew' - not-sink: 'nie tonie' + sink: 'tonąć' + not-sink: 'nie tonąć' no-clipboard: 'Nie ma schematu w schowku. Załaduj lub skopiuj coś.' delete: parameters: @@ -580,7 +580,7 @@ commands: Pomyślnie usunięto [number] śmierci graczowi [name], zmniejszając ich sumę do [total]śmierci. resetname: - description: reset gracz [prefix_island] nazwa + description: zresetuj nazwę [prefix_island] gracza success: 'Pomyślnie zresetowano nazwę [prefix_island] dla [name].' bentobox: description: komenda administracyjna BentoBoxa @@ -606,7 +606,7 @@ commands: jeśli później pojawią się błędy, uruchom ponownie serwer. unknown-addon: 'Nieznany dodatek!' locales: - description: przeładowuje locale[locale] + description: przeładowuje pliki językowe version: plugin-version: 'Wersja BentoBoxa: [version]' description: wyświetla wersje BentoBoxa i jego dodatków @@ -753,7 +753,7 @@ commands: setname: description: ustaw nazwę swojej wyspy name-too-short: 'Zbyt krótka. Minimalna długość to [number] znaków.' - name-too-long: 'Zbyt krótka. Minimalna długość to [number] znaków.' + name-too-long: 'Zbyt długa. Maksymalna długość to [number] znaków.' name-already-exists: 'W tym trybie gry jest już wyspa o tej nazwie.' parameters: success: 'Pomyślnie ustawiono nazwę twojej wyspy na [name].' @@ -884,7 +884,7 @@ commands: , aby zaprosić gracza , aby dołączyć do swojego zespołu RIGHT: - name: 'Kliknij prawym przyciskiem мыши' + name: 'Kliknij prawym przyciskiem myszy' coop: 'aby zaprosić gracza do kooperacji' SHIFT_LEFT: name: 'Przesuń lewy przycisk myszy' @@ -1070,14 +1070,14 @@ protection: description: |- Przełącz łamanie spawnerów. Nadpisuje flagę Łamanie Bloków. - name: Złamać spawnerów - hint: Złamanie spawnera wyłączone + name: Łamanie spawnerów + hint: Łamanie spawnerów wyłączone BREAK_HOPPERS: description: |- - Przełączanie zbijania ich hoppers. - Nadpisuje flagę Zbijanie Bloków. - name: Złam hoppers - hint: Wyłączono niszczenie hoppers + Przełączanie niszczenia lejów. + Nadpisuje flagę Niszczenie Bloków. + name: Łamanie lejów + hint: Niszczenie lejów wyłączone BREEDING: description: Przełącz interakcje name: Rozmnażanie zwierząt @@ -1314,7 +1314,7 @@ protection: FIRE_EXTINGUISH: description: Przełącz gaszenie ognia name: Gaszenie ognia - hint: Gaszenie ognia jest jest wyłączone. + hint: Gaszenie ognia jest wyłączone. FIRE_IGNITE: name: Zapłon ognia description: |- @@ -1324,23 +1324,23 @@ protection: name: Rozprzestrzenianie ognia description: Przełącz rozprzestrzenianie FISH_SCOOPING: - name: Łowienie ryb - description: Zezwól na łowienie ryb za pomocą wiadra - hint: Łowienie ryb jest jest wyłączone. + name: Zbieranie ryb wiadrem + description: Zezwól na zbieranie ryb za pomocą wiadra + hint: Zbieranie ryb wiadrem jest wyłączone. FLINT_AND_STEEL: name: Krzesiwo description: |- Pozwól graczom zapalać ogień za pomocą krzesiwa. - hint: Używanie krzesiwa jest jest wyłączone. + hint: Używanie krzesiwa jest wyłączone. FURNACE: description: Przełącz użycie name: Piec - hint: Używanie piecy jest jest wyłączone. + hint: Używanie piecy jest wyłączone. GATE: description: Przełącz użycie name: Furtki - hint: Używanie furtek jest jest wyłączone. + hint: Używanie furtek jest wyłączone. GEO_LIMIT_MOBS: description: |- Usuń moby wychodzące @@ -1367,22 +1367,22 @@ protection: HURT_ANIMALS: description: Przełącz zabijanie zwierząt name: Zabijanie zwierząt - hint: Zabijanie zwierząt jest jest wyłączone. + hint: Zabijanie zwierząt jest wyłączone. HURT_MONSTERS: description: Przełącz zabijanie potworów name: Zabijanie potworów - hint: Zabijanie potworów jest jest wyłączone. + hint: Zabijanie potworów jest wyłączone. HURT_VILLAGERS: description: Przełącz zabijanie osadników name: Zabijanie osadników - hint: Zabijanie osadników jest jest wyłączone. + hint: Zabijanie osadników jest wyłączone. ITEM_FRAME: name: Ramka na przedmioty description: |- Przełącz interakcję. Nadpisuje ustawienie stawiania i niszczenia bloków - hint: Używanie ramek na przedmioty jest jest wyłączone. + hint: Używanie ramek na przedmioty jest wyłączone. ITEM_FRAME_DAMAGE: description: |- Moby mogą uszkodzić @@ -1410,7 +1410,7 @@ protection: JUKEBOX: description: Przełącz użycie name: Szafa grająca - hint: Używanie szafy grającej jest jest wyłączone. + hint: Używanie szafy grającej jest wyłączone. LEAF_DECAY: name: Gnicie liści description: Pozwól liściom na naturalne gnicie @@ -1430,7 +1430,7 @@ protection: LEVER: description: Przełącz użycie name: Dźwignie - hint: Używanie dźwigni jest jest wyłączone. + hint: Używanie dźwigni jest wyłączone. LIMIT_MOBS: description: |- Ogranicz liczbę jednostek, @@ -1463,11 +1463,11 @@ protection: MILKING: description: Przełącz dojenie krów name: Dojenie - hint: Dojenie krów jest jest wyłączone. + hint: Dojenie krów jest wyłączone. MINECART: name: Wagoniki description: Przełącz interakcje z wagonikami - hint: Używanie wagoników jest jest wyłączone. + hint: Używanie wagoników jest wyłączone. MONSTER_NATURAL_SPAWN: description: Włącz lub wyłącz naturalne pojawianie się potworów name: Naturalne pojawienie się potworów @@ -1549,15 +1549,15 @@ protection: POTION_THROWING: name: Rzucanie mikstur description: 'Przełącz rzucanie mikstur trwałych i rzucanych.' - hint: Rzucanie mikstur jest jest wyłączone. + hint: Rzucanie mikstur jest wyłączone. NETHER_PORTAL: description: Przełącz użycie name: Portal do Netheru - hint: Używanie portali jest jest wyłączone. + hint: Używanie portali jest wyłączone. END_PORTAL: description: Przełącz użycie name: Portal końcowy - hint: Używanie portali jest jest wyłączone. + hint: Używanie portali jest wyłączone. PAUSE_MOB_GROWTH: name: Wstrzymaj wzrost mobów description: |- @@ -1576,7 +1576,7 @@ protection: name: PVP w kresie hint: 'PVP jest wyłączone w świecie kresu.' enabled: 'PVP w świecie kresu zostało włączone.' - disabled: 'PVP w świecie kresu zostało jest wyłączone.' + disabled: 'PVP w świecie kresu zostało wyłączone.' PVP_NETHER: description: |- Włącz / wyłącz PVP @@ -1584,7 +1584,7 @@ protection: name: PVP w piekle hint: 'PVP jest wyłączone w piekle.' enabled: 'PVP w piekle zostało włączone.' - disabled: 'PVP w piekle zostało jest wyłączone.' + disabled: 'PVP w piekle zostało wyłączone.' PVP_OVERWORLD: description: |- Włącz / wyłącz PVP @@ -1592,7 +1592,7 @@ protection: name: PVP na wyspie hint: 'PVP jest wyłączone na wyspie.' enabled: 'PVP na wyspie zostało włączone.' - disabled: 'PVP na wyspie zostało jest wyłączone.' + disabled: 'PVP na wyspie zostało wyłączone.' REDSTONE: description: Przełącz dostęp name: Przedmioty redstone @@ -1611,7 +1611,7 @@ protection: RIDING: description: Przełącz ujeżdzanie zwierząt name: Ujeżdzanie zwierząt - hint: Ujeżdzanie zwierząt jest jest wyłączone. + hint: Ujeżdzanie zwierząt jest wyłączone. SHEARING: description: Przełącz strzyżenie owiec name: Strzyżenie owiec @@ -1625,7 +1625,7 @@ protection: Pozwala zmienić typ jednostki spawnera za pomocą jaja spawnującego. name: Zmiana spawnerów jajami spawnującymi - hint: Zmienianie typu spawnera jajem jest jest wyłączone. + hint: Zmienianie typu spawnera jajem jest wyłączone. SCULK_SENSOR: description: 'Przełącza aktywację sensora sculk.' name: Czujnik Sculk @@ -1652,7 +1652,7 @@ protection: To ustawienie nie nadpisuje ochrony przed użyciem krzesia. name: Używanie TNT - hint: Używanie TNT jest jest wyłączone. + hint: Używanie TNT jest wyłączone. TRADING: description: Przełącz handlowanie name: Handlowanie z osadnikami @@ -1674,7 +1674,7 @@ protection: TURTLE_EGGS: description: Przełącz niszczenie name: Żółwie jaja - hint: Niszczenie żółwich jaj jest jest wyłączone. + hint: Niszczenie żółwich jaj jest wyłączone. FROST_WALKER: description: Przełącz zaklęcie Mroźny Piechur name: Mroźny Piechur @@ -1682,7 +1682,7 @@ protection: EXPERIENCE_PICKUP: name: Podnoszenie doświadczenia description: Przełącz podnoszenie doświadczenia - hint: Podnoszenie doświadczenia jest jest wyłączone. + hint: Podnoszenie doświadczenia jest wyłączone. PREVENT_TELEPORT_WHEN_FALLING: name: Zapobiegaj teleportacji podczas spadania description: |- @@ -1704,12 +1704,12 @@ protection: jeśli umrą na swoim własnym [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Ochrona przed pustką na wyspie spawnu description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Gdy włączone, gracze którzy wpadną + w pustkę na wyspie spawnu + zostaną przeteleportowani z powrotem + do punktu spawnu zamiast zginąć. RAID_TRIGGER: name: Wyzwalanie najazdu description: Ustawia minimalny rang wyspy wymagany do wyzwolenia najazdu @@ -1986,18 +1986,18 @@ enums: STARVATION: Głód POISON: Zatrucie MAGIC: Magia - WITHER: Zgniatacz + WITHER: Wither FALLING_BLOCK: Spadający Blok THORNS: Kolce DRAGON_BREATH: Oddech Smoka - CUSTOM: Zwyczaj - FLY_INTO_WALL: Lecieć w Ścianę + CUSTOM: Niestandardowe + FLY_INTO_WALL: Zderzenie ze Ścianą HOT_FLOOR: Gorąca Podłoga - CRAMMING: Cramming + CRAMMING: Ściśnięcie DRYOUT: Wysuszenie - FREEZE: Zatrzymaj się - KILL: Zabij - SONIC_BOOM: Sonic Boom + FREEZE: Zamrożenie + KILL: Komenda /kill + SONIC_BOOM: Fala Uderzeniowa WORLD_BORDER: Granica Świata panel: credits: @@ -2024,7 +2024,7 @@ panels: buttons: bundle: name: '[name]' - description: '[opis]' + description: '[description]' uses: 'Użyto [number]/[max]' unlimited: 'Nielimitowane użycia dozwolone' cost: 'Koszt: [cost]' @@ -2041,7 +2041,7 @@ panels: author: '- [name]' selected: 'Obecnie wybrane.' placeholder: - title: 'Placeholder Browser' + title: 'Przeglądarka symboli zastępczych' buttons: bentobox: name: 'BentoBox' From 49cbb28073fe57479ec5c701c5b19013d5798141 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:19:52 -0700 Subject: [PATCH 18/95] Fix Portuguese (pt.yml) locale: translate untranslated strings, fix broken tags and wrong translations - Translate untranslated English sections: maxsize command, SPAWN_PROTECTION flag - Fix ~30 broken legacy color codes (&uma, &um, & c, etc.) replaced with proper MiniMessage tags - Fix conversation-prefix containing AI response, set to '>' - Fix wrong translations: "Danos no peito" -> "Dano em baus" (chest damage), "Modo" -> "Moderador" (mod rank), "Estudando" -> "Aglomeracao" (CRAMMING), "Ataque da multidao" -> "Ataque de entidade" (ENTITY_ATTACK), "digitando" -> "entrando em" (now-entering), "Toxico" -> "Veneno" (POISON) - Fix now-leaving-your-island showing "entering" instead of "leaving" - Fix player-unbanned message saying "banido" (banned) instead of "desbanido" - Fix typos: "BConstruindo" -> "Construindo", "seconds" -> "segundos" - Fix stray ": c" in none-invited-you message - Fix panel flag-item layouts (name-layout, description-layout, menu-layout, setting-layout) with corrupted [description]/[name] placeholders - Fix compatibility state descriptions with broken version lines - Fix [versao] placeholder to [version] to match expected placeholder name Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/pt.yml | 182 +++++++++++++++--------------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/src/main/resources/locales/pt.yml b/src/main/resources/locales/pt.yml index 99fc05aad..1f1001233 100644 --- a/src/main/resources/locales/pt.yml +++ b/src/main/resources/locales/pt.yml @@ -169,8 +169,8 @@ commands: player-has: 'O jogador [name] tem [number] ilhas' duplicate-member: 'O jogador [name] é membro de mais de uma ilha no banco de dados' rank-on-island: '[rank] na ilha em [xyz]' - fixed: '&uma fixa' - done: '&uma digitalização' + fixed: 'Corrigido' + done: 'Verificação concluída' kick: parameters: description: expulse um jogador de um time @@ -192,10 +192,10 @@ commands: Aviso: este jogador agora possui [number] ilhas. Isso é mais do que o permitido pelas configurações ou permissões: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Define o tamanho máximo de equipe para a [prefix_island] de um jogador (use 0 para redefinir para o padrão do mundo) + success: 'Definido o tamanho máximo de equipe da [prefix_island] de [name] para [number].' + reset: 'Redefinido o tamanho máximo de equipe da [prefix_island] de [name] para o padrão do mundo ([number]).' range: description: comando de intervalo da ilha de administração invalid-value: @@ -288,7 +288,7 @@ commands: protection-coords: 'Coordenadas de Proteção: [xz1] até [xz2]' is-spawn: Ilha é uma ilha de spawn banned-players: 'Jogadores banidos:' - banned-format: '& c [name]' + banned-format: '[name]' unowned: 'Sem dono' bundle: 'Pacote de Blueprint usado para criar a ilha: [name]' switch: @@ -490,7 +490,7 @@ commands: Alguns caracteres foram removidos porque não são permitidos. O novo ID será [name]. success: Sucesso! - conversation-prefix: Sure! Please provide the text you would like me to translate. + conversation-prefix: '>' description: quit: desistir instructions: | @@ -692,8 +692,8 @@ commands: Membros da equipe não podem criar ilhas no mesmo mundo que sua equipe [prefix_island]. pasting: - estimated-time: 'Tempo estimado: [number] seconds.' - blocks: 'BConstruindo bloco por bloco: [number] blocos em todos...' + estimated-time: 'Tempo estimado: [number] segundos.' + blocks: 'Construindo bloco por bloco: [number] blocos no total...' entities: 'Preenchendo com entidades: [number] entidades em todas...' dimension-done: 'Ilha em [mundo] é construída.' done: 'Concluído! Sua ilha está pronta e esperando por você!' @@ -898,7 +898,7 @@ commands: cannot-invite-self: 'Você não pode se convidar!' cooldown: 'Você não pode convidar essa pessoa por mais [number] segundos.' island-is-full: 'Sua ilha está cheia, você não pode convidar mais ninguém.' - none-invited-you: 'Ninguém convidou você: c.' + none-invited-you: 'Ninguém convidou você.' you-already-are-in-team: 'Você já está em uma equipe!' already-on-team: 'Esse jogador já está em um time!' invalid-invite: 'Esse convite não é mais válido, desculpe.' @@ -982,8 +982,8 @@ commands: parameters: cannot-unban-yourself: 'Você não pode se desbanir!' player-not-banned: 'O jogador não está banido.' - player-unbanned: '[name]agora foi banido da sua ilha.' - you-are-unbanned: '[name]retirou você da ilha deles!' + player-unbanned: '[name] agora foi desbanido da sua ilha.' + you-are-unbanned: '[name] retirou seu banimento da ilha deles!' banlist: description: listar jogadores banidos noone: 'Ninguém está proibido nesta ilha.' @@ -1020,7 +1020,7 @@ ranks: visitor: Visitante banned: Banido admin: Administrador - mod: Modo + mod: Moderador protection: command-is-banned: Comando é proibido para visitantes flags: @@ -1119,12 +1119,12 @@ protection: description: |- Alternar interação com todos os contêineres. Inclui: barril, colmeia de abelhas, suporte de cerveja, - e um baú, compostor, dispensador, conta-gotas, - e um vaso de flores, fornalha, funil, moldura de item, - & uma jukebox, baú de minecart, caixa shulker, - & um baú preso. + baú, compostor, dispensador, conta-gotas, + vaso de flores, fornalha, funil, moldura de item, + jukebox, baú de minecart, caixa shulker, + baú preso. - Alterar substituições de configurações individuais + Alterar configurações individuais substitui esta bandeira. hint: Acesso ao contêiner desativado CHEST: @@ -1202,8 +1202,8 @@ protection: description: Alternar interação do funil hint: Interação do Hopper desativada CHEST_DAMAGE: - description: Alternar dano no peito causado por explosões - name: Danos no peito + description: Alternar dano em baús causado por explosões + name: Dano em baús CHORUS_FRUIT: description: Alternar teletransporte name: Frutas do refrão @@ -1211,9 +1211,9 @@ protection: CLEAN_SUPER_FLAT: description: |- Ative para limpar qualquer - e pedaços super planos em - &um mundo insular - name: Limpo Super Plano + pedaço super plano em + mundos de [prefix_island] + name: Limpar Super Plano COARSE_DIRT_TILLING: description: |- Alternar cultivo grosso @@ -1248,16 +1248,16 @@ protection: hint: Acesso ao ambiente de trabalho desativado CREEPER_DAMAGE: description: | - Alternar trepadeira - & uma proteção contra danos - name: Proteção contra danos à trepadeira + Alternar dano de + creeper. + name: Dano de creeper CREEPER_GRIEFING: description: | - Alternar o luto da trepadeira - &uma proteção quando aceso - pelo visitante da ilha. - name: Proteção contra o luto da trepadeira - hint: Creeper de luto desativado + Alternar proteção contra griefing + de creeper quando aceso + por visitante da [prefix_island]. + name: Proteção contra griefing de creeper + hint: Griefing de creeper desativado CROP_PLANTING: description: 'Defina quem pode plantar sementes.' name: Plantio de culturas @@ -1296,10 +1296,10 @@ protection: hint: Os baús Ender estão desativados neste mundo ENDERMAN_DEATH_DROP: description: |- - Endermen cairá - qualquer bloco que eles sejam - & uma propriedade se for morto. - name: Queda mortal de Enderman + Endermen soltarão + qualquer bloco que estejam + segurando se forem mortos. + name: Drop de morte de Enderman ENDERMAN_GRIEFING: description: |- Endermen pode remover @@ -1318,10 +1318,10 @@ protection: description: Exibir mensagens de entrada e saída island: ilha de [name] name: Mensagens de entrada/saída - now-entering: 'Agora digitando [name].' + now-entering: 'Agora entrando em [name].' now-entering-your-island: 'Agora entrando na sua ilha: [name]' now-leaving: 'Agora saindo da ilha de [name].' - now-leaving-your-island: 'Agora entrando na sua ilha: [name]' + now-leaving-your-island: 'Agora saindo da sua [prefix_island]: [name]' EXPERIENCE_BOTTLE_THROWING: name: Experimente jogar garrafas description: Alternar garrafas de experiência de lançamento. @@ -1366,15 +1366,15 @@ protection: hint: Uso do portão desabilitado GEO_LIMIT_MOBS: description: |- - Remova mobs que vão - parte externa protegida - &um espaço de ilha - name: 'Limitar mobs à ilha' + Remover mobs que saem + do espaço protegido + da [prefix_island] + name: 'Limitar mobs à [prefix_island]' HARVEST: description: |- Definir quem pode colher colheitas. - Não se esqueça de permitir o item - e uma picape também! + Não se esqueça de permitir a coleta + de itens também! name: Colheita hint: Colheita desativada HIVE: @@ -1408,8 +1408,8 @@ protection: ITEM_FRAME_DAMAGE: description: |- Mobs podem danificar - &um quadro de item - name: Danos na estrutura do item + molduras de item + name: Dano em moldura de item INVINCIBLE_VISITORS: description: |- Configurar visitante invencível @@ -1456,8 +1456,8 @@ protection: LIMIT_MOBS: description: |- Limitar entidades de - desova neste jogo - &um modo. + desova neste modo + de jogo. name: 'Limitar geração de tipo de entidade' can: 'Pode gerar' cannot: 'Não é possível gerar' @@ -1468,7 +1468,7 @@ protection: da faixa de proteção da ilha. Desativá-lo ajuda a evitar lava e água geração de paralelepípedos na área entre - e duas ilhas. + duas ilhas. Observe que os líquidos ainda fluirão verticalmente. Eles também não se espalharão horizontalmente se @@ -1480,8 +1480,8 @@ protection: CHANGE_SETTINGS: name: Mudar configurações description: |- - Permitir mudar qual membro - &uma função pode alterar as configurações da ilha. + Permitir mudar qual função de + membro pode alterar as configurações da [prefix_island]. MILKING: description: Alternar ordenha de vaca name: Ordenha @@ -1558,10 +1558,10 @@ protection: name: Redstone off-line PETS_STAY_AT_HOME: description: |- - Quando ativos, animais de estimação domesticados - só pode ir para e - não pode sair do proprietário - & uma ilha natal. + Quando ativo, animais domesticados + só podem ir para e + não podem sair da [prefix_island] + natal do proprietário. name: Animais de estimação ficam em casa PISTON_PUSH: description: |- @@ -1634,10 +1634,10 @@ protection: hint: Interação Redstone desativada REMOVE_END_EXIT_ISLAND: description: |- - Impede a saída final - &uma ilha de gerar + Impede a [prefix_island] de + saída final de gerar nas coordenadas 0,0 - name: Remover ilha de saída final + name: Remover [prefix_island] de saída final REMOVE_MOBS: description: |- Remova monstros quando @@ -1665,15 +1665,15 @@ protection: permitido SCULK_SENSOR: description: |- - Alterna o sensor de escultura - &uma ativação. - name: Sensor de escultura + Alterna a ativação do + sensor sculk. + name: Sensor Sculk hint: a ativação do sensor sculk está desativada SCULK_SHRIEKER: description: |- - Alterna o grito do sculk - &uma ativação. - name: Sculk Gritador + Alterna a ativação do + sculk shrieker. + name: Sculk Shrieker hint: a ativação do sculk shrieker está desativada SIGN_EDITING: description: |- @@ -1741,12 +1741,12 @@ protection: Membros da Ilha ainda perdem seus itens se eles morrerem em sua própria ilha! SPAWN_PROTECTION: - name: Spawn island void protection + name: Proteção contra o vazio na ilha de spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Quando ativado, jogadores que caem + no vazio na ilha de spawn + serão teletransportados de volta ao + ponto de spawn em vez de morrer. RAID_TRIGGER: name: Gatilho de ataque description: Define o nível mínimo de ilha necessário para desencadear um ataque @@ -1804,7 +1804,7 @@ protection: name: 'Redefinir para o padrão' description: | Redefine TODOS as configurações para seus - &um valor padrão. + valor padrão. confirm: confirmar instructions: 'Você tem certeza? Digite "confirmar" para redefinir tudo.' PROTECTION: @@ -1824,9 +1824,9 @@ protection: title: '[nome_do_mundo] Proteções mundiais' description: | Configurações de proteção quando - &um jogador está fora de sua ilha + jogador está fora de sua [prefix_island] flag-item: - name-layout: '&um nome]' + name-layout: '[name]' command-instructions: setname: |- Selecione a classificação que pode @@ -1880,22 +1880,22 @@ protection: Selecione a classificação que pode usar o comando de borda description-layout: | - &Uma descrição] + [description] - Clique com o botão esquerdo em para descer. - Clique com o botão direito em para avançar. + Clique com o botão esquerdo para descer. + Clique com o botão direito para avançar. Permitido para: allowed-rank: '- [rank]' blocked-rank: '- [rank]' minimal-rank: '- [rank]' menu-layout: | - &Uma descrição] + [description] Clique em para abrir. setting-cooldown: 'A configuração está em espera' setting-layout: | - &Uma descrição] + [description] Clique em para alternar. @@ -1941,39 +1941,39 @@ management: name: 'Compatibilidade' description: COMPATIBLE: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um COMPATÍVEL software de servidor e - &uma versão. + versão. Seus recursos são totalmente projetados para - executado neste ambiente. + executar neste ambiente. SUPPORTED: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um SUPORTADO software de servidor e - &uma versão. + versão. A maioria de seus recursos funcionará perfeitamente neste ambiente. NOT_SUPPORTED: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um NÃO SUPORTADO software de servidor ou - &uma versão. + versão. Embora a maioria de seus recursos sejam executados corretamente, bugs específicos da plataforma ou problemas são esperados. INCOMPATIBLE: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um INCOMPATÍVEL software de servidor ou - &uma versão. + versão. Comportamentos estranhos e bugs podem ocorrer e a maioria dos recursos pode ser instável. @@ -2002,7 +2002,7 @@ catalog: [descrição] Clique em para obter o link para o - e um lançamento mais recente. + lançamento mais recente. already-installed: Já instalado! install-now: Instale agora! empty-here: @@ -2015,7 +2015,7 @@ catalog: enums: DamageCause: CONTACT: Contato - ENTITY_ATTACK: Ataque da multidão + ENTITY_ATTACK: Ataque de entidade ENTITY_SWEEP_ATTACK: Ataque de varredura PROJECTILE: Projétil SUFFOCATION: Asfixia @@ -2031,16 +2031,16 @@ enums: LIGHTNING: Raio SUICIDE: Suicídio STARVATION: Inanição - POISON: Tóxico + POISON: Veneno MAGIC: Magia WITHER: Murchar FALLING_BLOCK: Bloco caindo THORNS: Espinhos DRAGON_BREATH: Bafo de dragão CUSTOM: Personalizado - FLY_INTO_WALL: Voe para dentro da parede + FLY_INTO_WALL: Voou contra a parede HOT_FLOOR: Piso Quente - CRAMMING: Estudando + CRAMMING: Aglomeração DRYOUT: Secar FREEZE: Congelar KILL: Matar From 2c2b0895ae530f8183697491fb65a2fd5e88bf94 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:20:13 -0700 Subject: [PATCH 19/95] Fix Simplified Chinese (zh-CN.yml) locale: translate untranslated strings and fix errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (was entirely English) - Translate SPAWN_PROTECTION flag name and description (was entirely English) - Translate CRAFTER flag (was partially English: "Crafter访问禁用") - Translate "Placeholder Browser" panel title - Fix broken legacy color code: '&' prefix in setprotectionlocation confirmation - Fix broken placeholder: [&prefix_island] -> [prefix_island] in tpuser - Fix wrong translation: not-in-team said "在" (is in) instead of "不在" (is not in) - Fix typo: "的都信息" -> "的岛屿信息" in admin info description - Fix mistranslation: "奖金" (bonus money) -> "奖励" (bonus) for protection range bonus - Fix '&退出' -> "'退出'" in blueprint name prompt and description instructions - Clean up empty tag in blueprint sink status Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/zh-CN.yml | 39 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/resources/locales/zh-CN.yml b/src/main/resources/locales/zh-CN.yml index 49c21c0de..2f08bcb2c 100644 --- a/src/main/resources/locales/zh-CN.yml +++ b/src/main/resources/locales/zh-CN.yml @@ -32,7 +32,7 @@ general: no-safe-location-found: '试图将你传送到岛屿上时找不到安全的落脚点.' not-owner: '你不是这座岛屿的岛主!' player-is-not-owner: '[name]不是这座岛屿的岛主!' - not-in-team: '该玩家在你的团队中!' + not-in-team: '该玩家不在你的团队中!' offline-player: '该玩家已离线或不存在.' unknown-player: '未知玩家: [name]!' general: '该命令尚未就绪 - 请联系管理员' @@ -169,9 +169,9 @@ commands: extra-islands: '警告: 该玩家当前拥有[number]个岛屿, 最多仅可以拥有[max]个岛屿.' maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: 设置玩家的 [prefix_island] 最大团队人数 (使用 0 重置为世界默认值) + success: '已将[name]的 [prefix_island] 最大团队人数设置为 [number].' + reset: '已将[name]的 [prefix_island] 最大团队人数重置为世界默认值 ([number]).' range: description: 岛屿保护范围管理员命令 invalid-value: @@ -226,7 +226,7 @@ commands: player-has-more-than-one-island: '玩家拥有多个岛屿, 请指定一个岛屿.' info: parameters: <玩家> - description: 获取当前岛屿或指定玩家的都信息 + description: 获取当前岛屿或指定玩家的岛屿信息 no-island: '你当前没有岛屿...' title: '========== 岛屿信息 ============' island-uuid: 'UUID: [uuid]' @@ -248,7 +248,7 @@ commands: islands-in-trash: '岛屿在垃圾桶中.' protection-range: '岛屿保护范围: [range]' protection-range-bonus-title: '包含以下奖励:' - protection-range-bonus: '奖金: [number]' + protection-range-bonus: '奖励: [number]' purge-protected: '岛屿处于清理保护状态' max-protection-range: '历史最大保护范围: [range]' protection-coords: '岛屿保护界线: [xz1] 至 [xz2]' @@ -303,7 +303,7 @@ commands: manual: '没有找到安全的落脚点! 请手动传送至[location]附近检查原因.' tpuser: parameters: <传送玩家> <[prefix_island]的玩家> [玩家的岛] - description: 将玩家传送到另一个玩家的 [&prefix_island] + description: 将玩家传送到另一个玩家的 [prefix_island] getrank: parameters: [island owner] description: 获取指定玩家的身份等级 @@ -318,7 +318,7 @@ commands: parameters: '[x y z coords]' description: 将当前位置或指定坐标作为岛屿保护的中心点 island: '这将影响玩家[name]位于[xyz]的岛屿.' - confirmation: '&你确定要将[xyz]设置为当前岛屿保护的中心点吗?' + confirmation: '你确定要将[xyz]设置为当前岛屿保护的中心点吗?' success: '成功将[xyz]设置为当前岛屿保护的中心点.' fail: |- 未能将[xyz]设置为当前岛屿保护的中心点! @@ -366,7 +366,7 @@ commands: description: 复制两个选取点所示区域内的所有非空气方块(如果有[air]参数则包含空气方块) sink: description: 将此蓝图设置为粘贴时沉入海底。 - status: '蓝图会在粘贴时 [status] ' + status: '蓝图会在粘贴时 [status]' sink: '沉没' not-sink: '不下沉' no-clipboard: '剪贴板中没有蓝图。加载或复制一些东西。' @@ -437,7 +437,7 @@ commands: 它将出现在玩家创建岛屿界面中 name: quit: 退出 - prompt: 请输入蓝图方案名称, 或输入&退出取消创建蓝图方案 + prompt: 请输入蓝图方案名称, 或输入'退出'取消创建蓝图方案 too-long: '蓝图方案名称过长, 请确保在32个字符以内.' pick-a-unique-name: '该蓝图方案名称已存在, 请换一个名称.' stripped-char-in-unique-name: '其中的非法字符已被删除, 岛屿方案名称为: [name].' @@ -448,7 +448,7 @@ commands: instructions: |- 请为[name]蓝图方案输入描述 每输入一次为一行 - 最后输入&退出退出编辑 + 最后输入'退出'退出编辑 default-color: '' success: '蓝图方案描述添加成功!' cancelling: '取消编辑蓝图方案描述!' @@ -1051,9 +1051,9 @@ protection: description: '允许禁止打开木桶' hint: 禁止打开木桶 CRAFTER: - name: 手工艺者 - description: 切换使用 - hint: Crafter访问禁用 + name: 合成器 + description: 切换合成器的使用 + hint: 禁止使用合成器 BLOCK_EXPLODE_DAMAGE: description: '允许禁止床与重生锚破坏方块和对实体造成伤害' name: '爆炸伤害与破坏' @@ -1569,12 +1569,11 @@ protection: 禁止时: 玩家在他人岛屿死亡掉落 岛屿成员在自己的岛屿上死亡时仍然会掉落物品和经验 SPAWN_PROTECTION: - name: Spawn island void protection + name: 出生岛虚空保护 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 启用后, 在出生岛掉入虚空的 + 玩家将被传送回出生点, + 而不会死亡. RAID_TRIGGER: name: 触发袭击 description: 设置触发袭击所需的岛屿最低等级 @@ -1861,7 +1860,7 @@ panels: author: '- [name]' selected: '当前已选择该语言' placeholder: - title: 'Placeholder Browser' + title: '占位符浏览器' buttons: bentobox: name: 'BentoBox' From 3b66ed0cff1b11b6e0c7e09af52e851b1c5dd005 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:20:29 -0700 Subject: [PATCH 20/95] Fix Latvian (lv.yml) locale: translate untranslated strings and fix wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section from English to Latvian - Translate SPAWN_PROTECTION flag from English to Latvian - Fix DamageCause enums: CONTACT (was "Contact us"), FALL (was "Autumn"), VOID (was gibberish AI text), DRAGON_BREATH (was "Horse Breath"), FLY_INTO_WALL (imperative form), FREEZE (was food freezing), KILL (was imperative), SONIC_BOOM (was "bloom"), CRAMMING, DRYOUT, SUFFOCATION, POISON, ENTITY_SWEEP_ATTACK, and others - Fix TRAPPED_CHEST (was "imprisoned furnaces" / "cups") - Fix CANDLES hint (was "sandwiches") - Fix CRAFTER hint (was offensive "invalīda") - Fix WITHER_DAMAGE name (was just "Toggle") - Fix PVP_NETHER messages (was "Netherlands" instead of Nether/Elles) - Fix PVP_END typo "Biegu" -> "Beigu" - Fix Frost Walker (was "Island Walker" - sala vs sals) - Fix FLINT_AND_STEEL (was "Karms" - wrong word) - Fix HURT_TAMED_ANIMALS name/hint - Fix HURT_VILLAGERS duplicate word in hint - Fix garbled language parameter [lвек] -> [valoda] - Fix untranslated "Type" in purge regions confirm - Fix sink translation (was "kitchen sink") - Fix various typos: veiskmīgi, pieveinots, neveinas, skatitam, satusu, mēgīni, Pārslaigāt, Pārlēgt, tirogties, blokkus - Fix Axolotl hint (was "melting") Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/lv.yml | 165 +++++++++++++++--------------- 1 file changed, 80 insertions(+), 85 deletions(-) diff --git a/src/main/resources/locales/lv.yml b/src/main/resources/locales/lv.yml index 76e023080..07ac0420f 100644 --- a/src/main/resources/locales/lv.yml +++ b/src/main/resources/locales/lv.yml @@ -12,7 +12,7 @@ prefixes: islands: saliņas general: success: 'Darīts!' - invalid: Nederīgs + invalid: Nederīgs! beta: 'Šī komanda ir beta versijā. Pārliecinieties, ka jums ir dublējumi!' errors: command-cancelled: 'Komanda atcleta.' @@ -116,15 +116,15 @@ commands: scanning-in-progress: 'Skenēšana notiek, lūdzu, gaidiet' none-found: 'Nav atrastas salas, kuras varētu izdzēst.' total-islands: 'Jums ir [number] salas jūsu datu bāzē visās pasaulēs.' - number-error: 'Parametram ir jābūt dienu skatitam.' + number-error: 'Parametram ir jābūt dienu skaitam.' confirm: 'Raksti [label] purge confirm, lai sāktu dzēšanu' completed: 'Dzēšana pabeigta.' - see-console-for-status: Dzēšana uzsākta. Skati terminālī, lai redzētu satusu. + see-console-for-status: Dzēšana uzsākta. Skati terminālī, lai redzētu statusu. no-purge-in-progress: 'Šobrīd nav nevienas tīrīšanas procedūras.' regions: parameters: '[days]' description: Iztīrīt salas, izdzēšot veco reģiona failus - confirm: 'Type /[label] purge regions confirm, lai sāktu attīrīt' + confirm: 'Ievadi /[label] purge regions confirm, lai sāktu attīrīt' protect: description: Pārslēgt salas aizsargāšanu no dzēšanas move-to-island: 'Sākumā pārvietojies uz salas!' @@ -148,7 +148,7 @@ commands: description: pievieno spēlētāju īpašnieka salai name-not-owner: '[name] nav salas īpašnieks.' name-has-island: '[name] jau pieder kāda sala. Atreģistrē vai izdzēs to vispirms!' - success: '[name]ir pieveinots [owner]salai.' + success: '[name] ir pievienots [owner] salai.' disband: parameters: <īpašnieks> description: izformē īpašnieka komandu @@ -187,10 +187,10 @@ commands: Brīdinājums: šim spēlētājam tagad pieder [number] salas. Tas ir vairāk nekā atļautais limits pēc iestatījumiem vai atļaujām: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Iestatīt maksimālo komandas izmēru spēlētāja [prefix_island] (izmantojiet 0, lai atiestatītu uz pasaules noklusējumu) + success: 'Iestatīts [name] [prefix_island] maksimālais komandas izmērs uz [number].' + reset: 'Atiestatīts [name] [prefix_island] maksimālais komandas izmērs uz pasaules noklusējumu ([number]).' range: description: Admina salas distances komanda invalid-value: @@ -304,7 +304,7 @@ commands: Numuram jābūt starp 1 un [number]. Lieto [label] trash [player], lai redzētu salas numuru cannot-switch: 'Pārslēgšana neizdevās! Skaties kļūdu paziņojumu konsulē.' - success: 'Spēlētāja sala veiskmīgi pārslēgta uz uzstādīto numuru.' + success: 'Spēlētāja sala veiksmīgi pārslēgta uz uzstādīto numuru.' trash: no-unowned-in-trash: 'Nav salas atkritnē bez īpašniekiem' no-islands-in-trash: 'Spēlētājam nav salas atkritnē' @@ -369,7 +369,7 @@ commands: setspawn: description: uzstāda kā sākuma salu šajā pasaulē visiem spēlētājiem already-spawn: 'Šī sala jau ir uzstādīta kā sākuma sala!' - no-island-here: 'Šeit nav neveinas salas.' + no-island-here: 'Šeit nav nevienas salas.' confirmation: 'Vai tiešām vēlies uzstādīt šo salu kā sākuma salu?' success: 'Šī sala ir veiksmīgi uzstādīta kā sākuma sala šajā pasaulē.' setspawnpoint: @@ -414,8 +414,8 @@ commands: iestatiet šo plānu, lai tas iegremdētos okeāna dibenā, kad tas tiek ielikt. status: 'Zīmējums būs [status] , kad to ieliks.' - sink: 'izlietne' - not-sink: 'neiegrimst' + sink: 'iegremdēts' + not-sink: 'neiegremdēts' no-clipboard: 'Klipbordā nav nevienas plāna. Ielādējiet vai kopējiet kaut ko.' delete: parameters: @@ -595,7 +595,7 @@ commands: reload: description: parlādēt iestatījumus, papildinājumus (ja atbalstīts) un valodas locales-reloaded: 'Valodas faili pārlādēti.' - addons-reloaded: 'Papildinājumu pārlādēti.' + addons-reloaded: 'Papildinājumi pārlādēti.' settings-reloaded: 'Iestatījumi pārlādēti.' addon: 'Pārlādē [name].' addon-reloaded: '[name] pārlādēts.' @@ -985,7 +985,7 @@ commands: description: attaino salas iestatījumus language: description: valodu izvēle - parameters: '[lвек]' + parameters: '[valoda]' not-available: 'Šī valoda nav pieejama.' already-selected: 'Jūs jau izmantojat šo valodu.' expel: @@ -1034,9 +1034,9 @@ protection: name: Bruņu statīvi hint: Bruņu statīva lietošana atslēgta AXOLOTL_SCOOPING: - name: Axolotl izsistīšana + name: Axolotl izsmelšana description: Atļaut axolotlu izņemšanu ar spaini - hint: Axolotl kausēšana atspējota + hint: Axolotl izsmelšana atspējota BEACON: description: Pārslēdz izmantošanu name: Signāluguņi @@ -1092,16 +1092,16 @@ protection: name: Pogas hint: Pogu spiešana nav atļauta CANDLES: - description: Pārlēgt sveču mijiedarbību + description: Pārslēgt sveču mijiedarbību name: Svecītes - hint: Sviestmaizīšu mijiedarbība atslēgta + hint: Sveču mijiedarbība atslēgta CAKE: description: Pārslēdz iespēju ēst kūkas name: Kūkas hint: Kūku ēšana nav atļauta CARTOGRAPHY: name: Kartogrāfijas galdi - description: Pārslaigāt lietošanu + description: Pārslēgt lietošanu hint: Kartogrāfijas galda piekļuve atspējota CONTAINER: name: Kontaineri @@ -1113,7 +1113,7 @@ protection: ar citiem karogiem. hint: Konteineru atvēršana nav atļauta CHEST: - name: Lādēm un vagona lādēm + name: Lādes un vagona lādes description: |- Pārslēgt mijiedarbību ar lādzēm un lādes vilcieniem. @@ -1126,13 +1126,13 @@ protection: CRAFTER: name: Amatnieks description: Pārslēgt lietošanu - hint: Amatnieks invalīda + hint: Amatnieka lietošana atspējota BLOCK_EXPLODE_DAMAGE: description: |- Atļaut gultām & atkārtotas atdzimšanas enkuriem sagraut blokos un nodarīt bojājumus entītijām. - name: Bloku sprādziena bojājumu + name: Bloku sprādziena bojājumi COMPOSTER: name: Komposteri description: Pārslēgt kompostera mijiedarbību @@ -1140,24 +1140,24 @@ protection: LOOM: name: Stelles description: Pārslēgt lietošanu - hint: Loom piekļuve atspējota + hint: Stellu piekļuve atspējota FLOWER_POT: name: Ziedu podi description: Pārslēgt puķu poda mijiedarbību hint: Zieda poda mijiedarbība atspējota GRINDSTONE: - name: Sasmalcināšana + name: Galantiņš description: Pārslēgt lietošanu - hint: Grindstone piekļuve atslēgta + hint: Galantiņa piekļuve atslēgta SHULKER_BOX: name: Shulker kastes description: Pārslēgt shulker kastes mijiedarbību hint: Shulker kastes piekļuve atslēgta SHULKER_TELEPORT: description: |- - Šulker var teleports + Šulkeri var teleportēties ja ir aktīvs. - name: Shulker teleports + name: Šulkeru teleportācija SMITHING: name: Kalšana description: Pārslēgt lietošanu @@ -1167,9 +1167,9 @@ protection: description: Pārslēgt lietošanu hint: Akmensgriezuma piekļuve ir atspējota TRAPPED_CHEST: - name: Ieslodzītās krāsnis - description: Pārslēgt slēgtās krūzes mijiedarbību - hint: Ieslēgta slēgtā krūze piekļuve atslēgta + name: Slazdotās lādes + description: Pārslēgt slazdoto lāžu mijiedarbību + hint: Slazdoto lāžu piekļuve atslēgta DISPENSER: name: Izšāvēji description: Pārslēdz izšāvēju izmantošanu @@ -1333,12 +1333,12 @@ protection: description: Pārslēdz iespēju zivis iesmelt spaiņos hint: Zivju iesmelšana nav atļauta FLINT_AND_STEEL: - name: Karms un dzelzs + name: Šķiltavas un tērauds description: |- Ļauj spēlētājiem aizdedzināt - uguni izmantojot karmu un - dzelzi vai ugunsbumbas. - hint: Karma un dzelzs un ugunsbumbas lietošana nav atļauta + uguni izmantojot šķiltavas un + tēraudu vai ugunsbumbas. + hint: Šķiltavu un tērauda un ugunsbumbu lietošana nav atļauta FURNACE: description: Pārslēdz iespēju lietot krāsnis name: Krāsns @@ -1368,8 +1368,8 @@ protection: description: >- Pārslēgt sāpju radīšanu. Ieslēgts nozīmē, ka pieradināti dzīvnieki var gūt bojājumus. Izslēgts nozīmē, ka tie ir neaizskarami. - name: Sist tame dzīvniekus - hint: Apturēt tāmēto dzīvnieku ievainojumus + name: Sist pieradinātos dzīvniekus + hint: Pieradināto dzīvnieku ievainošana nav atļauta HURT_ANIMALS: description: Pārslēdz iespēju ievainot dzīvniekus name: Ievainot dzīvniekus @@ -1383,7 +1383,7 @@ protection: Pārslēdz iespēju ievainot ciemata iedzīvotājus name: Ievainot ciematniekus - hint: Ciemata ievainošana ievainošana nav atļauta + hint: Ciematnieku ievainošana nav atļauta ITEM_FRAME: name: Priekšmetu rāmis description: |- @@ -1594,7 +1594,7 @@ protection: Ieslēgt/Izslēgt spēlētājs pret spēlētāja režīmu (PVP) Beigu pasaulē. - name: Biegu pasaules PVP + name: Beigu pasaules PVP hint: 'Spēlētājs nevar izdarīt bojājumus citam spēlētājam Beigu pasaulē' enabled: 'PVP Endā ir ieslēgts.' disabled: 'PVP Beigās ir atspējots.' @@ -1605,8 +1605,8 @@ protection: Ellē. name: Elles PVP hint: 'Spēlētājs nevar izdarīt bojājumus citam spēlētājam Ellē' - enabled: 'PVP ir iespējots Nīderā.' - disabled: 'PVP Nīderlandē ir atspējots.' + enabled: 'PVP Ellē ir iespējots.' + disabled: 'PVP Ellē ir atspējots.' PVP_OVERWORLD: description: |- Ieslēgt/Izslēgt spēlētājs @@ -1614,7 +1614,7 @@ protection: Virszemē. name: Virszemes PVP hint: 'Spēlētājs nevar izdarīt bojājumus citam spēlētājam Virszemē' - enabled: 'PVP Pārējo pasaulē ir ieslēgts.' + enabled: 'PVP Virszemē ir ieslēgts.' disabled: 'PVP Pasaulē ir atspējots.' REDSTONE: description: |- @@ -1693,7 +1693,7 @@ protection: hint: Aizdedzināt dinamītu nav atļauts TRADING: description: |- - Pārslēdz iespēju tirogties + Pārslēdz iespēju tirgoties ar ciemata iedzīvotājiem. name: Tirgošanās hint: Tirgošanās ar ciemata iedzīvotājiem nav atļauta @@ -1720,9 +1720,9 @@ protection: FROST_WALKER: description: |- Pārslēdz iespēju izmantot - sala staigātāja maģiju. - name: Sala staigātājs - hint: Sala staigātājs šeit nav atļauts + sals staigātāja maģiju. + name: Sals staigātājs + hint: Sals staigātājs šeit nav atļauts EXPERIENCE_PICKUP: name: Pieredzes savākšana description: |- @@ -1745,12 +1745,12 @@ protection: [prefix_Island] dalībnieki joprojām zaudē savus priekšmetus , ja viņi mirst savā [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Sākuma salas tukšuma aizsardzība description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Kad iespējots, spēlētāji, kas iekrīt + tukšumā sākuma salā, tiks + teleportēti atpakaļ uz sākuma + punktu, nevis mirs. RAID_TRIGGER: name: Iebrukuma aktivizēšana description: Iestata minimālo salas rangu, kas nepieciešams iebrukuma aktivizēšanai @@ -1769,20 +1769,20 @@ protection: izmantot vēja lādiņus šajā salā. hint: Vēja lādiņu izmantošana atspējota WITHER_DAMAGE: - name: Pārslēgt + name: Wither bojājumi description: |- - Ļauj katlem saplēst blokus + Ļauj Wither saplēst blokus un bojāt radības. WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Atļaut gultas & respawn enkuriem - iznīcināt blokķus un nodarīt + iznīcināt blokus un nodarīt bojājumus entitātēm ārpus [prefix_island] robežām. name: Pasaules bloka sprādziena bojājumi WORLD_TNT_DAMAGE: description: |- Atļaut TNT un TNT raktuvju - lauzt blokkus un nodarīt + lauzt blokus un nodarīt ievainojumus ārpus [prefix_island] robežām. name: Pasaule TNT kaitējums locked: 'Šī sala ir slēgta!' @@ -2016,42 +2016,37 @@ catalog: uzstādījumos vai arī mēģini vēlāk. enums: DamageCause: - CONTACT: Sazinieties - ENTITY_ATTACK: Mob uzbrukums - ENTITY_SWEEP_ATTACK: Sviestspēks uzbrukums - PROJECTILE: Izšautne - SUFFOCATION: Saspiestība - FALL: Rudens + CONTACT: Saskare + ENTITY_ATTACK: Radības uzbrukums + ENTITY_SWEEP_ATTACK: Vēziena uzbrukums + PROJECTILE: Šāviņš + SUFFOCATION: Nosmakšana + FALL: Kritiens FIRE: Uguns - FIRE_TICK: Dedzināšana - MELTING: Kusšana + FIRE_TICK: Degšana + MELTING: Kušana LAVA: Lava - DROWNING: Dziļūdens noslīkšana - BLOCK_EXPLOSION: Bloka Sprādziens - ENTITY_EXPLOSION: Entitātes sprādziens - VOID: >- - Izsistā vārtu stāvoklis: [state] \n\nFakts, ka spēlētājs ir izdzēsis savu - pasauli, atspoguļo [player] lēmumu. \n\nNekas vairs netika izdzēsts, kad - tas atgriezās uz [world]. \n\nNezinu, kāpēc tas aizgāja uz [location], bet - tas ir [explanation]. \n\nTagad [player] atpūšas unn šajā [dimension] ir - viss, kas palicis. \n\nNekas cits, kā tikai tukšums (dzīvība). + DROWNING: Noslīkšana + BLOCK_EXPLOSION: Bloka sprādziens + ENTITY_EXPLOSION: Radības sprādziens + VOID: Tukšums LIGHTNING: Zibens SUICIDE: Pašnāvība STARVATION: Izsalkums - POISON: Indīgums - MAGIC: Burvība + POISON: Saindēšanās + MAGIC: Maģija WITHER: Wither - FALLING_BLOCK: Kritušais Bloks - THORNS: Dzeloni - DRAGON_BREATH: Zirgu Elpa + FALLING_BLOCK: Krītošs bloks + THORNS: Ērkšķi + DRAGON_BREATH: Pūķa elpa CUSTOM: Pielāgots - FLY_INTO_WALL: Lidojiet Pret Sienu - HOT_FLOOR: Karstā Grīda - CRAMMING: Cramming - DRYOUT: Sausušana - FREEZE: Saldēt - KILL: Nogalini - SONIC_BOOM: Skaņas uzplaukums + FLY_INTO_WALL: Ietriekšanās sienā + HOT_FLOOR: Karstā grīda + CRAMMING: Saspiešana + DRYOUT: Izžūšana + FREEZE: Apsalšana + KILL: Nogalināšana + SONIC_BOOM: Skaņas vilnis WORLD_BORDER: Pasaules robeža panel: credits: @@ -2066,7 +2061,7 @@ panel: šim papildinājumam. Ļauj BentoBox savienoties ar GitHub - konfigurācijā vai mēgīni vēlāk. + konfigurācijā vai mēģini vēlāk. panels: island_homes: title: 'Jūsu [prefix_island] mājas' From 41e7019b38167a62753f6be98c7eb3e7faa9b5b2 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:20:30 -0700 Subject: [PATCH 21/95] Fix Russian (ru.yml) locale: translate untranslated strings, fix typos and broken formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (was entirely English) - Translate SPAWN_PROTECTION flag (was entirely English) - Translate REMOVE_END_EXIT_ISLAND flag (was entirely English) - Translate Placeholder Browser panel title - Translate "Copper Golem" to "медный голем" - Fix broken legacy color codes: &б -> , &а -> - Fix broken tag: bsp;c -> proper text - Fix typos: Яйко->Яйцо, клинт->клик, сдеал->сделал, ИГрок->Игрок, НЕПОДДЕРЖИМЕМОЙ->НЕПОДДЕРЖИВАЕМОЙ, переключательно->переключатель, участников->участником - Fix wrong translations: рекламировать->повысить (promote), раковина->погружаться (sink), антрестить->убрать доверие (untrust), Зубрёжка->Давка (CRAMMING), Соник Бум->Звуковой удар (SONIC_BOOM) - Fix swapped messages in expel section - Fix uncoop success message (was untranslated English) - Fix already-on message (was copy of already-off) - Fix purge status "of" -> "из" - Fix "version." leftover in INCOMPATIBLE section - Remove erroneous [Конце] brackets - Fix DamageCause nouns: Заморозить->Замерзание, Убить->Убийство, Влететь в стену->Столкновение со стеной, Сушка->Высыхание Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ru.yml | 101 +++++++++++++++--------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index ab679c637..4254bd1aa 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -112,7 +112,7 @@ commands: Сканирование островов в базе данных. Это может занять некоторое время в зависимости от того, сколько у вас количество... scanning-in-progress: 'Сканирование в процессе, пожалуйста, подождите' - none-found: 'bsp;c Нет найдено островов для очищения.' + none-found: 'Не найдено островов для очистки.' total-islands: 'У вас [number] островов в вашей базе данных во всех мирах.' number-error: 'Значение должно быть количеством дней' confirm: 'Введите /[label] purge confirm для начала очистки.' @@ -123,7 +123,7 @@ commands: no-purge-in-progress: 'В данный момент очистка не проводится.' regions: parameters: '[days]' - description: oстрова чистки путем удаления файлов старого региона + description: очистка островов путём удаления старых файлов регионов confirm: 'Тип /[label] purge regions confirm чтобы начать чистку' protect: description: переключатель защиты острова от очистки @@ -131,7 +131,7 @@ commands: protecting: 'Остров защищен от очистки.' unprotecting: 'Защита от очистки убрана.' stop: - description: оставить проводящуюся очистку + description: остановить проводящуюся очистку stopping: Очистка остановлена unowned: description: позволяет очистить острова без владельцев @@ -139,7 +139,7 @@ commands: status: description: отображает статус очистки status: >- - [purged] остров очищено of [purgeable] ([percentage] + [purged] островов очищено из [purgeable] ([percentage] %). team: description: управление командой @@ -187,10 +187,10 @@ commands: Внимание: у этого игрока теперь есть [number] островов. Это больше, чем разрешено настройками или правами: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: <игрок> <размер> + description: установить максимальный размер команды для [prefix_island] игрока (0 для сброса к мировому значению по умолчанию) + success: 'Установлен максимальный размер команды [name] для [prefix_island] на [number].' + reset: 'Сброшен максимальный размер команды [name] для [prefix_island] до мирового значения по умолчанию ([number]).' range: description: команда администратора по управлению областью острова invalid-value: @@ -199,7 +199,7 @@ commands: same-as-before: 'Радиус острова уже установлен в значении [number]!' display: already-off: 'Индикаторы уже выключены' - already-on: 'Индикаторы уже выключены' + already-on: 'Индикаторы уже включены' description: показать/скрыть индикаторы размера острова hiding: 'Скрыть индикаторы размера острова' hint: >- @@ -283,7 +283,7 @@ commands: max-protection-range: 'Самый большой радиус острова за все время: [range]' protection-coords: 'Радиус границ острова: от [xz1] до [xz2]' is-spawn: Остров является точкой спавна - banned-players: 'Забанненые игроки:' + banned-players: 'Забаненные игроки:' banned-format: '[name]' unowned: 'Не владелец' bundle: 'Пакет чертежей, использованный для создания острова: [name]' @@ -413,8 +413,8 @@ commands: sink: description: установите этот чертеж, чтобы он опустился на дно океана после вставки status: 'Чертеж будет [status] при вставке' - sink: 'раковина' - not-sink: 'не тонуть' + sink: 'погружаться на дно' + not-sink: 'не погружаться' no-clipboard: 'В буфере обмена нет чертежа. Загрузите или скопируйте что-нибудь.' delete: parameters: @@ -463,7 +463,7 @@ commands: правильно для установки trash: Мусор no-trash: Не удается удалить в мусор - trash-instructions: Правый клинт для удаления + trash-instructions: Правый клик для удаления no-trash-instructions: Не удается удалить пакет по умолчанию permission: Разрешение no-permission: Нет разрешения @@ -750,7 +750,7 @@ commands: confirmation: 'Вы уверены, что хотите установить точку дома в Незере?' the-end: not-allowed: 'Вам не разрешено устанавливать точку дома в Энд.' - confirmation: 'Вы уверены, что хотите установить свой дом в [Конце]?' + confirmation: 'Вы уверены, что хотите установить свой дом в Энде?' parameters: '[имя дома]' setname: description: устанавливает название вашего острова @@ -839,7 +839,7 @@ commands: all-members-logged-off: >- Все участники острова вышли из сети, так что вы больше не находитесь в кооперации на острове игрока [name]. - success: '[name] is no longer a coop member of your island.' + success: '[name] больше не является участником кооперации на вашем острове.' is-full: 'Вы не можете больше добавлять в кооперацию.' trust: description: сделать игрока доверенным на острове @@ -847,7 +847,7 @@ commands: trust-in-yourself: 'Поверьте в себя!' name-has-invited-you: '[name] пригласил вас стать довереннным игроком на его острове.' player-already-trusted: 'Игрок уже доверенный!' - you-are-trusted: 'Игрок [name] сдеал вас доверенным!' + you-are-trusted: 'Игрок [name] сделал вас доверенным!' success: 'Вы сделали игрока [name] доверенным.' is-full: 'Вы не можете доверять еще кому-либо, лимит достигнут!' untrust: @@ -881,7 +881,7 @@ commands: enter-name: 'Введите имя:' tips: LEFT: - name: '&б Левый Клик' + name: 'Левый Клик' search: 'Введите имя игрока' back: 'Назад' invite: |- @@ -921,7 +921,7 @@ commands: description: отклонить ожидающие подтверждения приглашения посетить ваш остров leave: cannot-leave: >- - Владелец не может покинуть остров! Сначала станьте участников, или + Владелец не может покинуть остров! Сначала станьте участником, или удалите всех участников. description: покинуть свой остров left-your-island: '[name] покинул ваш остров' @@ -946,8 +946,8 @@ commands: description: повышает ранг игрока на вашем острове parameters: <игрок> errors: - cant-promote-yourself: 'Вы не можете рекламировать себя!' - cant-promote: 'Вы не можете понизить себя!' + cant-promote-yourself: 'Вы не можете повысить себя!' + cant-promote: 'Вы не можете повышать более высокие ранги!' must-be-member: 'Игрок должен быть членом [prefix_an-island]!' failure: 'Игрока нельзя повысить еще выше!' success: 'Игрок [name] повышен до [rank]' @@ -980,7 +980,7 @@ commands: description: разбанить игрока на острове parameters: <игрок> cannot-unban-yourself: 'Вы не можете разбанить самого себя!' - player-not-banned: 'ИГрок не был забанен ранее.' + player-not-banned: 'Игрок не был забанен ранее.' player-unbanned: '[name]разбанен на вашем острове.' you-are-unbanned: '[name]разбанил вас на своем острове!' banlist: @@ -1003,8 +1003,8 @@ commands: cannot-expel: 'Этот игрок не может быть выгнан.' cannot-expel-member: 'Вы не можете выгнать участника группы!' not-on-island: 'Этот игрок не на вашем острове!' - player-expelled-you: '[name]был выгнан с вашего острова!' - success: 'Вы были выгнаны [name] с его острова.' + player-expelled-you: '[name] выгнал вас с острова!' + success: 'Вы выгнали [name] с острова.' lock: description: заблокировать или разблокировать ваш [prefix_island] locked: 'Ваш [prefix_island] теперь заблокирован.' @@ -1024,9 +1024,9 @@ protection: command-is-banned: Команда запрещена для посетителей flags: ALLAY: - name: Взаимодействие с тихонями и Copper Golem - description: Позволяет забирать/давать предметы тихоне и Copper Golem - hint: Взаимодействие с тихонями и Copper Golem запрещено + name: Взаимодействие с тихонями и медным големом + description: Позволяет забирать/давать предметы тихоне и медному голему + hint: Взаимодействие с тихонями и медным големом запрещено ANIMAL_NATURAL_SPAWN: description: переключатель пассивного спавна животных name: Пассивный спавн животных @@ -1200,7 +1200,7 @@ protection: description: Переключатель возможности взаимодействовать с воронкой hint: Взаимодействие с воронкой запрещено CHEST_DAMAGE: - description: переключательно получения сундуками урона от взрыва + description: переключатель получения сундуками урона от взрыва name: Урон сундукам CHORUS_FRUIT: description: переключатель телепортации @@ -1214,7 +1214,7 @@ protection: name: Очистить супер плоские чанки COARSE_DIRT_TILLING: description: |- - Переключательно очистки каменистой + Переключатель очистки каменистой земли и разрушения подзола для получения земли name: Очищение каменистой земли @@ -1267,7 +1267,7 @@ protection: name: Использование дверей hint: Использование дверей запрещено DRAGON_EGG: - name: Яйко Дракона + name: Яйцо Дракона description: |- Предотвращает взаимодействие с Яйцом Дракона. @@ -1602,10 +1602,10 @@ protection: hint: Взаимодействие с редстоун механизмами запрещено REMOVE_END_EXIT_ISLAND: description: |- - Prevents the end exit - island from generating - at coordinates 0,0 - name: Remove end exit island + Предотвращает генерацию + выходного [prefix_island] в Энде + на координатах 0,0 + name: Удалить выходной остров в Энде REMOVE_MOBS: description: |- Удаляет монстров, когда вы @@ -1699,12 +1699,12 @@ protection: Участники острова все еще будут терять вещи, если будут умирать на своем острове! SPAWN_PROTECTION: - name: Spawn island void protection + name: Защита от пустоты на острове спавна description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Если включено, игроки, упавшие + в пустоту на острове спавна, + будут телепортированы обратно на + точку спавна вместо смерти. RAID_TRIGGER: name: Запуск рейда description: Устанавливает минимальный ранг острова для запуска рейда @@ -1812,7 +1812,7 @@ protection: разъединить team-untrust: |- Выберите ранг, который может - антрестить + убрать доверие team-promote: |- Выберите ранг, который может повысить ранг игрока @@ -1914,7 +1914,7 @@ management: Запущена [name] [version]. BentoBox в настоящее время запущен на - НЕПОДДЕРЖИМЕМОЙ версии серверного ПО + НЕПОДДЕРЖИВАЕМОЙ версии серверного ПО Хотя большинство функций все равно будут работать корректно, специфичные для версии баги или иные проблемы @@ -1923,8 +1923,7 @@ management: Запущена [name] [version]. BentoBox в настоящее время запущен на - НЕСОВМЕСТИМОЙ версии серверного ПО - version. + НЕСОВМЕСТИМОЙ версии серверного ПО. Может возникать странное поведение и ошибки, а большинство функций могут быть нестабильными. @@ -1989,14 +1988,14 @@ enums: THORNS: Шипы DRAGON_BREATH: Драконье дыхание CUSTOM: Пользовательское - FLY_INTO_WALL: Влететь в стену + FLY_INTO_WALL: Столкновение со стеной HOT_FLOOR: Горячий пол - CRAMMING: Зубрёжка - DRYOUT: Сушка - FREEZE: Заморозить - KILL: Убить - SONIC_BOOM: Соник Бум - WORLD_BORDER: Мировая граница + CRAMMING: Давка + DRYOUT: Высыхание + FREEZE: Замерзание + KILL: Убийство + SONIC_BOOM: Звуковой удар + WORLD_BORDER: Граница мира panel: credits: title: '[name] Титры' @@ -2036,9 +2035,9 @@ panels: |[selected] authors: 'Авторы:' author: '- [name]' - selected: '&а В данный момент выбрано.' + selected: 'В данный момент выбрано.' placeholder: - title: 'Placeholder Browser' + title: 'Браузер заполнителей' buttons: bentobox: name: 'BentoBox' From 169131f26cb3781f772705903b98bfd799992407 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:21:09 -0700 Subject: [PATCH 22/95] Fix Romanian (ro.yml) locale: translated placeholders, broken tags, wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section and SPAWN_PROTECTION flag from English to Romanian - Fix broken legacy color codes: &b, &a, &un, &r replaced with MiniMessage tags - Restore translated placeholders to English: [număr]->[number], [nume]->[name], [proprietar]->[owner], [data]->[date], [gama]->[range], [interval]->[range], [lume]->[world], [secunde]->[seconds], [modul de joc]->[gamemode], [clasament]->[rank], [linie]->[line], [mesaj]->[message], [descriere]->[description], [autori]->[authors], [selectat]->[selected], [Numele]->[name] - Fix wrong translations: "Olanda" (Netherlands) -> "Nether", "Toamna" (Autumn) -> "Cădere" (Fall), "Bucherie" -> "Înghesuire" (Cramming), "Ferestre" (Windows) -> "Pupitre" (Lecterns), "lutru" (otter) -> "pupitru" (lectern), "dezabona" (unsubscribe) -> "ridică interdicția" (unban), "reproducere" (reproduction) -> "spawn" where appropriate - Fix unban messages that said "banned" instead of "unbanned" - Fix missing [ bracket in name-layout, description-layout, menu-layout, setting-layout - Fix stray "și 7" in last-seen layout and "și 2" in reload messages - Fix deaths.set.success broken color tags and text - Fix click-to-switch with broken [următor] placeholder -> [next] - Fix range.remove.success broken "&b" tag - Fix ENTER_EXIT_MESSAGES island placeholder Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ro.yml | 166 +++++++++++++++--------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/src/main/resources/locales/ro.yml b/src/main/resources/locales/ro.yml index f3c5f3ffa..303db0932 100644 --- a/src/main/resources/locales/ro.yml +++ b/src/main/resources/locales/ro.yml @@ -66,13 +66,13 @@ commands: modificați numărul de case permise pe această insulă sau pe insula jucătorului parameters: [numele insulei] - max-homes-set: '[nume] - Setați casele maxime ale insulei la [număr]' + max-homes-set: '[name] - Setați casele maxime ale insulei la [number]' errors: - unknown-island: Insulă necunoscută! [nume] + unknown-island: Insulă necunoscută! [name] resethome: description: Resetați casa jucătorului la valoarea implicită parameters: [numele insulei] - cleared: 'Resetare acasă. [nume]' + cleared: 'Resetare acasă. [name]' resets: description: editează resetările jucătorilor set: @@ -120,7 +120,7 @@ commands: timp, în funcție de câți ai... scanning-in-progress: 'Scanare în curs, așteptați' none-found: 'Nu s-au găsit insule de epurat.' - total-islands: 'Aveți [număr] insule în baza de date în toate lumi.' + total-islands: 'Aveți [number] insule în baza de date în toate lumi.' number-error: 'Argumentul trebuie să fie un număr de zile' confirm: 'Tastați /[label] purge confirm pentru a începe purjarea' completed: 'Purjarea sa oprit.' @@ -189,13 +189,13 @@ commands: confirmation: 'Sigur doriți să setați [name] să fie proprietarul insulei la [xyz]?' success: '[name] este acum proprietarul acestei insule.' extra-islands: >- - Avertisment: acest jucător deține acum [număr] insule. Acest lucru + Avertisment: acest jucător deține acum [number] insule. Acest lucru este mai mult decât permis de setări sau perms: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Setați dimensiunea maximă a echipei pentru [prefix_island] unui jucător (folosiți 0 pentru a reseta la valoarea implicită) + success: 'Dimensiunea maximă a echipei pentru [prefix_island] lui [name] a fost setată la [number].' + reset: 'Dimensiunea maximă a echipei pentru [prefix_island] lui [name] a fost resetată la valoarea implicită ([number]).' range: description: comanda de administrare a insulei invalid-value: @@ -236,7 +236,7 @@ commands: description: scade aria protejată a insulei parameters: [locația insulei] success: >- - Scăderea cu succes a zonei protejate de [name] la & b [total] + Scăderea cu succes a zonei protejate de [name] la [total] (- [number] ) . register: parameters: @@ -250,7 +250,7 @@ commands: O insulă nu poate fi plasată aici, îmi pare rău. Consultați consola pentru eventuale erori. island-is-spawn: >- - Insula este reprodusă. Esti sigur? Introduceți din nou comanda pentru + Insula este spawn. Ești sigur? Introduceți din nou comanda pentru a confirma. unregister: parameters: [x,y,z] @@ -268,12 +268,12 @@ commands: no-island: 'Nu vă aflați într-o insulă acum ...' title: '========== Informații despre insulă ============' island-uuid: 'UUID: [uuid]' - owner: 'Proprietar: [proprietar] ([uuid])' - last-login: 'Ultima autentificare: [data]' + owner: 'Proprietar: [owner] ([uuid])' + last-login: 'Ultima autentificare: [date]' last-login-date-time-format: EEE MMM dd HH:mm:ss zzz aaaa deaths: 'Decese: [number]' resets-left: 'Resetări: [number] (Max: [total])' - max-homes: 'Max case: [număr]' + max-homes: 'Max case: [number]' team-members-title: 'Membrii echipei:' team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -284,17 +284,17 @@ commands: island-center: 'Centrul insulei: [xyz]' island-coords: 'Coordonatele insulei: [xz1] la [xz2]' islands-in-trash: 'Player are insule în coșul de gunoi.' - protection-range: 'Domeniu de protecție: [interval]' + protection-range: 'Domeniu de protecție: [range]' protection-range-bonus-title: 'Include aceste bonusuri:' - protection-range-bonus: 'Bonus: [număr]' + protection-range-bonus: 'Bonus: [number]' purge-protected: Insula este protejată de purjare - max-protection-range: 'Cea mai mare gamă de protecție istorică: [gama]' + max-protection-range: 'Cea mai mare gamă de protecție istorică: [range]' protection-coords: 'Coordonate de protecție: de la [xz1] la [xz2]' - is-spawn: Insula este o insulă de reproducere + is-spawn: Insula este o insulă spawn banned-players: 'Jucători excluși:' banned-format: '[name]' unowned: 'Fără proprietate' - bundle: 'Blueprint Bundle folosit pentru a crea insula: [nume]' + bundle: 'Blueprint Bundle folosit pentru a crea insula: [name]' switch: description: activați / dezactivați ocolirea protecției op: >- @@ -380,15 +380,15 @@ commands: confirmation: 'Sigur doriți să setați această insulă ca spawn pentru această lume?' success: 'Setați cu succes această insulă ca spawn pentru această lume.' setspawnpoint: - description: setați locația curentă ca punct de reproducere pentru această insulă + description: setați locația curentă ca punct de spawn pentru această insulă no-island-here: 'Nu există insulă aici.' confirmation: >- - Sigur doriți să setați această locație ca punct de reproducere pentru + Sigur doriți să setați această locație ca punct de spawn pentru această insulă? success: >- - Setați cu succes această locație ca punct de reproducere pentru + Setați cu succes această locație ca punct de spawn pentru această insulă. - island-spawnpoint-changed: '[user] a schimbat acest punct de reproducere al insulei.' + island-spawnpoint-changed: '[user] a schimbat acest punct de spawn al insulei.' settings: parameters: '[jucător]' description: deschideți setările de sistem sau setările de insulă pentru player @@ -401,7 +401,7 @@ commands: file-exists: 'Fișierul există deja, suprascrieți?' no-such-file: 'Nu există un astfel de fișier!' could-not-load: 'Nu s-a putut încărca acel fișier!' - could-not-save: 'Hmm, ceva nu a funcționat bine salvând acel fișier: [mesaj]' + could-not-save: 'Hmm, ceva nu a funcționat bine salvând acel fișier: [message]' set-pos1: 'poziție 1 setată la [vector]' set-pos2: 'poziție 2 setată la [vector]' set-different-pos: 'Setați o altă locație - această poziție este deja setată!' @@ -492,7 +492,7 @@ commands: pick-a-unique-name: Vă rugăm să alegeți un nume mai unic stripped-char-in-unique-name: >- Unele caractere au fost eliminate deoarece nu sunt permise. ID - nou va fi [nume]. + nou va fi [name]. success: Succes! conversation-prefix: '>' description: @@ -512,7 +512,7 @@ commands: Faceți clic stânga pentru a crește Faceți clic dreapta pentru a reduce unlimited-times: Nelimitat - maximum-times: Max [număr] ori + maximum-times: Max [number] ori cost: | Costul [prefix_Island] Clic stânga +1 @@ -575,7 +575,7 @@ commands: set: description: stabilește moartea jucătorului parameters: - success: 'S-a setat cu succes [name] ecesele lui [number] & a.' + success: 'S-a setat cu succes decesele lui [name] la [number].' add: description: adaugă morți jucătorului parameters: @@ -607,8 +607,8 @@ commands: error: 'Nu s-a putut scrie lista de substituenți: [message]' reload: description: reîncarcă BentoBox și toate suplimentele, setările și setările locale - locales-reloaded: '[prefix_bentobox] și 2 limbi reîncărcate.' - addons-reloaded: '[prefix_bentobox] și 2 addonuri reîncărcate.' + locales-reloaded: '[prefix_bentobox] Limbi reîncărcate.' + addons-reloaded: '[prefix_bentobox] Addonuri reîncărcate.' settings-reloaded: '[prefix_bentobox] Setări reîncărcate.' addon: '[prefix_bentobox] Reîncărcare [name] .' addon-reloaded: '[prefix_bentobox] [name] reîncărcat.' @@ -650,21 +650,21 @@ commands: description: enumerați, adăugați sau eliminați ranguri parameters: '[lista | adauga | elimina] [referință de rang] [valoare de rang]' add: - success: '[clasament] adăugat cu valoarea [număr]' + success: '[rank] adăugat cu valoarea [number]' failure: >- - Nu s-a putut adăuga [clasament] cu valoarea [număr]. Poate un + Nu s-a putut adăuga [rank] cu valoarea [number]. Poate un duplicat? remove: - success: '[clasament] eliminat' + success: '[rank] eliminat' failure: 'Nu s-a putut elimina [rank]. Rang necunoscut.' list: 'Clasamentele înregistrate sunt după cum urmează:' confirmation: - confirm: 'Tastați din nou comanda în [secunde] s pentru a confirma.' + confirm: 'Tastați din nou comanda în [seconds] s pentru a confirma.' previous-request-cancelled: 'Cererea de confirmare anterioară a fost anulată.' request-cancelled: 'Timpul limită de confirmare - cererea a fost anulată.' delay: previous-command-cancelled: 'Comanda anterioară a fost anulată' - stand-still: 'Nu vă mișcați! Se teleportează în [secunde] secunde' + stand-still: 'Nu vă mișcați! Se teleportează în [seconds] secunde' moved-so-command-cancelled: 'Te-ai mutat. Teleportul a fost anulat!' island: about: @@ -705,7 +705,7 @@ commands: estimated-time: 'Timp estimat: [number] secunde.' blocks: 'Construiți-l bloc cu bloc: [number] blocuri în toate ...' entities: 'Completarea cu entități: [number] entități în toate ...' - dimension-done: 'Insulă în [lume] este construită.' + dimension-done: 'Insulă în [world] este construită.' done: 'Gata! Insula ta este gata și te așteaptă!' pick: 'Alegeți o insulă' cannot-afford: 'Nu vă puteți permite acest lucru! Cost: [cost]' @@ -749,14 +749,14 @@ commands: sethome: description: setați punctul dvs. de teleportare de acasă must-be-on-your-island: 'Trebuie să fii pe insula ta pentru a pleca acasă!' - too-many-homes: 'Nu se poate seta - insula ta este la maximum [număr] case.' + too-many-homes: 'Nu se poate seta - insula ta este la maximum [number] case.' home-set: 'Casa insulei dvs. a fost setată la locația dvs. curentă.' homes-are: 'Casele din Island sunt:' - home-list-syntax: '[nume]' + home-list-syntax: '[name]' click-to-teleport: 'Faceți clic pentru a vă teleporta!' nether: - not-allowed: 'Nu aveți voie să vă stabiliți casa în Olanda.' - confirmation: 'Sunteți sigur că doriți să vă stabiliți casa în Olanda?' + not-allowed: 'Nu aveți voie să vă stabiliți casa în Nether.' + confirmation: 'Sunteți sigur că doriți să vă stabiliți casa în Nether?' the-end: not-allowed: 'Nu aveți voie să vă setați casa la sfârșit.' confirmation: 'Sigur doriți să vă setați casa la sfârșit?' @@ -819,7 +819,7 @@ commands: offline: 'o [name] ([last_seen])' offline-not-last-seen: 'o [name]' last-seen: - layout: '[number] și 7 [unitate] în urmă' + layout: '[number] [unit] în urmă' days: zile hours: ore minutes: minute @@ -838,7 +838,7 @@ commands: you-are-a-coop-member: 'Ați fost cooptat de [name] .' success: 'Ați copiat [name] .' name-has-invited-you: | - [nume] v-a invitat + [name] v-a invitat să se alăture ca membru coop insulei lor. uncoop: @@ -858,7 +858,7 @@ commands: parameters: trust-in-yourself: 'Ai încredere în tine!' name-has-invited-you: | - [nume] v-a invitat + [name] v-a invitat să se alăture ca membru de încredere insulei lor. player-already-trusted: 'Player este deja de încredere!' @@ -878,7 +878,7 @@ commands: invitation-sent: 'Invitație trimisă la [name] .' removing-invite: 'Eliminarea invitației.' name-has-invited-you: | - [nume] v-a invitat + [name] v-a invitat să se alăture insulei lor. to-accept-or-reject: >- echipă Do / [label] acceptă să accepte, sau / [label] echipa @@ -894,7 +894,7 @@ commands: search: 'Căutați un jucător' searching: | Căutând - [nume] + [name] enter-name: 'Introduceți numele:' tips: LEFT: @@ -947,9 +947,9 @@ commands: kick: description: scoateți un membru din insula dvs. parameters: - player-kicked: '[Numele] te-a dat afară de pe insulă în [modul de joc]!' + player-kicked: '[name] te-a dat afară de pe insulă în [gamemode]!' cannot-kick: 'Nu te poți lovi cu piciorul!' - cannot-kick-rank: 'Rangul tău nu permite să-l lovești pe [nume]!' + cannot-kick-rank: 'Rangul tău nu permite să-l lovești pe [name]!' success: '[name] a fost dat afară din insula dvs.' demote: description: retrogradează un jucător pe insula ta într-un rang @@ -995,17 +995,17 @@ commands: owner-banned-you: '[name] v-a interzis din insula lor!' you-are-banned: 'Ești interzis din această insulă!' unban: - description: dezabonează un jucător de pe insula ta + description: ridică interdicția unui jucător de pe insula ta parameters: - cannot-unban-yourself: 'Nu vă puteți dezabona!' + cannot-unban-yourself: 'Nu vă puteți ridica propria interdicție!' player-not-banned: 'Player nu este interzis.' - player-unbanned: '[name] este acum interzis de pe insula dvs.' - you-are-unbanned: '[name] te-a interzis de pe insula lor!' + player-unbanned: '[name] nu mai este interzis de pe insula dvs.' + you-are-unbanned: '[name] v-a ridicat interdicția de pe insula lor!' banlist: description: lista jucătorilor interzisi noone: 'Nimeni nu este interzis pe această insulă.' the-following: 'Următorii jucători sunt interziși:' - names: '[linie]' + names: '[line]' you-can-ban: 'Puteți interzice până la [number] mai mulți jucători.' settings: description: afișează setările insulei @@ -1184,7 +1184,7 @@ protection: hint: Accesul la cutia Shulker este dezactivat SHULKER_TELEPORT: description: |- - &un Shulker se poate teleporta + Un Shulker se poate teleporta dacă este activ. name: Teleportarea lui Shulker SMITHING: @@ -1330,7 +1330,7 @@ protection: hint: Utilizarea Enderpearl este dezactivată ENTER_EXIT_MESSAGES: description: Afișați mesajele de intrare și ieșire - island: insula [numele] + island: '[prefix_island] lui [name]' name: Introduceți / ieșiți din mesaje now-entering: 'Acum introduceți [name] .' now-entering-your-island: 'Acum intrând în insula ta: [name]' @@ -1455,14 +1455,14 @@ protection: name: Utilizarea lesei hint: Utilizarea lesei este dezactivată LECTERN: - name: Ferestre + name: Pupitre description: |- - Permiteți plasarea cărților pe un lutru + Permiteți plasarea cărților pe un pupitru sau să iei cărți din ea. Nu împiedică jucătorii citirea cărților. - hint: nu poate așeza o carte pe un lutru sau lua o carte de pe ea. + hint: nu poate așeza o carte pe un pupitru sau lua o carte de pe ea. LEVER: description: Comutați utilizarea name: Utilizarea manetei @@ -1495,7 +1495,7 @@ protection: name: Schimbați setările description: |- Permiteți să comutați ce membru - &un rol poate modifica setările insulei. + un rol poate modifica setările insulei. MILKING: description: Comutați mulsul de vacă name: Mulsul @@ -1633,11 +1633,11 @@ protection: PVP_NETHER: description: |- Activați / dezactivați PVP - în Olanda. + în Nether. name: PVP Nether - hint: PVP dezactivat în Olanda + hint: PVP dezactivat în Nether enabled: 'PVP-ul din Nether a fost activat.' - disabled: 'PVP din Olanda a fost dezactivat.' + disabled: 'PVP din Nether a fost dezactivat.' PVP_OVERWORLD: description: |- Activați / dezactivați PVP @@ -1724,7 +1724,7 @@ protection: name: Copaci care cresc în afara razei de acțiune description: |- Comutați dacă arborii pot crește în afara unei - &zona de protecție a unei insule sau nu. + zona de protecție a unei insule sau nu. Nu numai că va preveni așezarea puieților în afara zonei de protecție a unei insule de la creștere, dar va bloca și generația @@ -1759,12 +1759,12 @@ protection: Membrii Island încă își pierd obiectele dacă mor pe propria lor insulă! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protecția insulei spawn împotriva vidului description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Când este activat, jucătorii care cad + în vid pe insula spawn + vor fi teleportați înapoi la + punctul de spawn în loc să moară. RAID_TRIGGER: name: Declanșare raid description: Setează rangul minim al insulei necesar pentru a declanșa un raid @@ -1817,7 +1817,7 @@ protection: expert: name: 'Setări expert' description: 'Afișează toate setările disponibile.' - click-to-switch: 'Faceți clic pe pentru a comuta la [următor] & r .' + click-to-switch: 'Faceți clic pe pentru a comuta la [next].' reset-to-default: name: 'Resetați la valorile implicite' description: | @@ -1844,7 +1844,7 @@ protection: Setări de protecție când jucător se află în afara insulei lor flag-item: - name-layout: 'nume]' + name-layout: '[name]' command-instructions: setname: | Selectați rangul care poate @@ -1898,7 +1898,7 @@ protection: Selectați rangul care poate utilizați comanda border description-layout: | - descriere] + [description] Faceți clic stânga pentru a merge în jos. Faceți clic dreapta pe pentru a merge în sus. @@ -1908,12 +1908,12 @@ protection: blocked-rank: '- [rank]' minimal-rank: '- [rank]' menu-layout: | - descriere] + [description] Faceți clic pe pentru a deschide. setting-cooldown: 'Setarea este activată' setting-layout: | - descriere] + [description] Faceți clic pe pentru a comuta. @@ -2039,7 +2039,7 @@ enums: ENTITY_SWEEP_ATTACK: Atac cu Sweep PROJECTILE: Proiectil SUFFOCATION: Sufocare - FALL: Toamna + FALL: Cădere FIRE: Foc FIRE_TICK: Ardere MELTING: Topire @@ -2060,7 +2060,7 @@ enums: CUSTOM: Personalizat FLY_INTO_WALL: Zboară în perete HOT_FLOOR: Podea fierbinte - CRAMMING: Bucherie + CRAMMING: Înghesuire DRYOUT: Uscarea FREEZE: Îngheţa KILL: Ucide @@ -2084,14 +2084,14 @@ panels: island_homes: title: 'Casele tale de pe insula' buttons: - name: '[nume]' + name: '[name]' island_creation: title: 'Alegeți o insulă' buttons: bundle: - name: '[nume]' - description: '[descriere]' - uses: 'Folosit [număr]/[max]' + name: '[name]' + description: '[description]' + uses: 'Folosit [number]/[max]' unlimited: 'Utilizări nelimitate permise' cost: 'Cost: [cost]' language: @@ -2099,12 +2099,12 @@ panels: edited: 'Schimbat în [lang]' buttons: language: - name: '[nume]' + name: '[name]' description: |- - [autori] - |[selectat] + [authors] + |[selected] authors: 'autori: ' - author: '- [nume]' + author: '- [name]' selected: 'Selectat în prezent.' placeholder: title: 'Placeholder Browser' @@ -2147,10 +2147,10 @@ panels: buttons: previous: name: 'Pagina anterioară' - description: 'Comutați la pagina [număr].' + description: 'Comutați la pagina [number].' next: name: 'Pagina următoare' - description: 'Comutați la pagina [număr].' + description: 'Comutați la pagina [number].' tips: click-to-next: 'Faceți clic pe pentru următorul.' click-to-previous: 'Faceți clic pe pentru anterior.' From 62d8e76e81e07aa3b18c0885b97262182a7febdc Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:21:23 -0700 Subject: [PATCH 23/95] Fix Turkish (tr.yml) locale: translate untranslated strings, fix broken tags and wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English: maxsize section, SPAWN_PROTECTION, VISITOR_KEEP_INVENTORY, WORLD_BLOCK_EXPLODE_DAMAGE, accept confirmation, cannot-switch, hint strings (jukebox, note block, portals, turtle eggs, frost walker), Placeholder Browser title, Commits label, catalog descriptions - Fix broken color codes: '& 7'/'& c' -> MiniMessage tags, '&Yapıştırılıyor' -> proper tag - Fix wrong translations: Görünmez (invisible) -> Yenilmez (invincible), Kulaklık (headphones) -> Tasma (leash), Kayış -> Tasma, Nakarat meyvesi -> Koro Meyvesi, Aşırı Dünya -> Üst Dünya (overworld), Sıkışmış göğüs -> Tuzaklı sandık (trapped chest), Kığırlaştırıcı -> Buz Yürüyücü, Duvara Yapışma -> Duvara Uçma, tanıtamazsın -> terfi ettiremezsin, Son Sayfa -> Sonraki Sayfa, [tamed animals] -> Evcil hayvanlara - Fix typos: 9artık -> artık, iteşimie -> iletişime, teleporto -> teleport, Kullanım kullanımı -> Zanaatkar kullanımını aç/kapat - Translate 'obtain dirt' leftover English in COARSE_DIRT_TILLING - Translate 'Allowed for:' in flag panel Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/tr.yml | 106 +++++++++++++++--------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/main/resources/locales/tr.yml b/src/main/resources/locales/tr.yml index 375a189bb..2f9bfe3b4 100644 --- a/src/main/resources/locales/tr.yml +++ b/src/main/resources/locales/tr.yml @@ -18,7 +18,7 @@ general: errors: command-cancelled: 'Komut iptal edildi!' no-permission: 'Bu izne sahip degilsin! Ada açamıyorsan /ada' - insufficient-rank: 'Rankınız bunu yapacak kadar yüksek değil! (& 7 [rank] & c)' + insufficient-rank: 'Rankınız bunu yapacak kadar yüksek değil! ([rank])' use-in-game: 'Bu komutu sadece oyundayken kullanabilirsin!' use-in-console: 'Bu komut yalnızca konsolda kullanılabilir.' no-team: 'Bir takımda değilsin!' @@ -32,7 +32,7 @@ general: not-in-team: 'Oyuncu senin takımında degil!' offline-player: 'Oyuncu çevrimdışı ya da yok.' unknown-player: '[name] adlı bir oyuncu yok!' - general: 'u komut henüz hazır değil. - Admin ile iteşimie geç!' + general: 'Bu komut henüz hazır değil. - Admin ile iletişime geç!' unknown-command: 'Bilinmeyen komut. /[label] help' wrong-world: 'Bu komudu kullanmak için adanda olmalısın!' you-must-wait: 'Komut yazabilmek için [number] saniye beklemelisin!' @@ -40,7 +40,7 @@ general: not-on-island: '[prefix_island] üzerinde değilsin!' slow-down: 'Yavaş ol. Daha yavaş tıkla.' worlds: - overworld: Aşırı Dünya + overworld: Üst Dünya nether: Nether the-end: Son commands: @@ -60,7 +60,7 @@ commands: description: >- bu [prefix_island] veya oyuncunun [prefix_island] için izin verilen ev sayısını değiştir - parameters: [[prefix_adası] isim] + parameters: [[prefix_island] isim] max-homes-set: '[name] - [prefix_island] maksimum ev sayısını [number] olarak ayarla' errors: unknown-island: Bilinmeyen [prefix_island]! [name] @@ -187,9 +187,9 @@ commands: izinler tarafından izin verilen [max] miktarından fazladır. maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: Bir oyuncunun [prefix_island] maksimum takım boyutunu ayarla (dünya varsayılanına sıfırlamak için 0 kullan) + success: '[name] oyuncusunun [prefix_island] maksimum takım boyutu [number] olarak ayarlandı.' + reset: '[name] oyuncusunun [prefix_island] maksimum takım boyutu dünya varsayılanına ([number]) sıfırlandı.' range: description: Admin ada menzili ayarlama invalid-value: @@ -299,7 +299,7 @@ commands: out-of-range: >- Sayı 1 ila [number] arasında olmalıdır. [player] Çöp olan ada numaralarını görmek için [label] - cannot-switch: 'Switch failed. See console log for error.' + cannot-switch: 'Değiştirme başarısız oldu. Hata için konsol kaydına bakın.' success: 'Başarıyla oyuncunun adasını belirtilen ada değiştirdi..' trash: no-unowned-in-trash: 'Çöpte sahipsiz ada yok.' @@ -432,7 +432,7 @@ commands: description: Taslağın orta noktası olduğun pozisyon olarak belirler. paste: description: Panodaki taslağı olduğun bölgeye yapıştırır. - pasting: '&Yapıştırılıyor...' + pasting: 'Yapıştırılıyor...' pos1: description: Kare bir alan için 1. pozisyonu ayarlar. pos2: @@ -814,7 +814,7 @@ commands: all-members-logged-off: >- Tum ada oyuncuları cevrımdısı. Isci yetkin [name]adasından alındı! - success: '[name] 9artık adanda işçi değil!' + success: '[name] artık adanda işçi değil!' is-full: 'Başkasını kooperatif üyesi yapamazsınız.' trust: description: Adana arkadas ekle @@ -884,8 +884,8 @@ commands: bakabilirsin! name-joined-your-island: '[name] adana katıldı!' confirmation: |- - Are you sure you want to accept this invite? - You will LOSE your current island! + Bu daveti kabul etmek istediğine emin misin? + Mevcut adanı KAYBEDECEKSİN! reject: description: Daveti reddet you-rejected-invite: 'Ada katılma istegini reddettin!' @@ -917,7 +917,7 @@ commands: description: Adandaki üyelerin yetkisini yükselt. parameters: errors: - cant-promote-yourself: 'Kendini tanıtamazsın!' + cant-promote-yourself: 'Kendini terfi ettiremezsin!' cant-promote: 'Rütbenizin üstüne terfi edemezsiniz!' must-be-member: 'Oyuncu [prefix_an-island] üyesi olmalıdır!' failure: 'Oyuncunun rankı daha fazla artıralamıyor!' @@ -1095,7 +1095,7 @@ protection: hint: Varil erişimi devre dışı bırakıldı CRAFTER: name: Zanaatkar - description: Kullanım kullanımı + description: Zanaatkar kullanımını aç/kapat hint: Zanaatkar devre dışı BLOCK_EXPLODE_DAMAGE: description: |- @@ -1138,7 +1138,7 @@ protection: hint: Taş kesim erişimi devre dışı bırakıldı TRAPPED_CHEST: name: Kapana kısılmış sandıklar - description: Sıkışmış göğüs etkileşimini aç/kapat + description: Tuzaklı sandık etkileşimini aç/kapat hint: Kapana kısılmış sandık erişimi devre dışı DISPENSER: name: Fırlatıcı @@ -1161,7 +1161,7 @@ protection: name: Sandık hasarı CHORUS_FRUIT: description: Işınlanma kullanımı değiş. - name: Nakarat meyvesi + name: Koro Meyvesi hint: Işınlanma kapalı CLEAN_SUPER_FLAT: description: |- @@ -1173,7 +1173,7 @@ protection: description: |- Çapa ile iri taneli toprak topraği sürmeyi kapar/açar. - obtain dirt + toprak elde etme name: İri taneli toprak sürme hint: İri taneli toprağı sürme kapalı. COLLECT_LAVA: @@ -1325,7 +1325,7 @@ protection: description: >- Zarar verme aç/kapa. Etkin olduğunda, evcil hayvanlar hasar alabilir. Devre dışı olduğunda, onları yok edilemez hale getirir. - name: Zarar verme [tamed animals] + name: Evcil hayvanlara zarar verme hint: Ehlileştirilmiş hayvan zarar verme devre dışı HURT_ANIMALS: description: Hasar alımını değiş @@ -1350,7 +1350,7 @@ protection: name: Item Frame Hasarı INVINCIBLE_VISITORS: description: 'Ziyaretçi ayarlarını ayarlar.' - name: 'Görünmez misafirler' + name: 'Yenilmez misafirler' hint: 'Misafirler korunuyor.' ISLAND_RESPAWN: description: |- @@ -1368,14 +1368,14 @@ protection: JUKEBOX: description: Kullanımını değiş. name: Müzik kutusu kullanımı. - hint: No jukebox use allowed + hint: Müzik kutusu kullanımına izin verilmez LEAF_DECAY: name: Yaprak düşümü description: Yaprak düşümünü değiş. LEASH: description: Kullanımını değiş. - name: Kayış kullanımı - hint: Kulaklık kullanımı devre dışı bırakıldı + name: Tasma kullanımı + hint: Tasma kullanımı devre dışı bırakıldı LECTERN: name: Kürsü description: |- @@ -1452,7 +1452,7 @@ protection: NOTE_BLOCK: description: Kullanımını değiş. name: Nota bloğu - hint: No note block use + hint: Nota bloğu kullanımına izin verilmez OBSIDIAN_SCOOPING: name: Obsidiyeni lava dönüştürme description: |- @@ -1505,11 +1505,11 @@ protection: NETHER_PORTAL: description: Kullanımı değiş. name: Cehennem Portalı - hint: Portal use is disallowed + hint: Portal kullanımına izin verilmez END_PORTAL: description: Kullanımı değiş. name: Son Portal - hint: Portal use is disallowed + hint: Portal kullanımına izin verilmez PAUSE_MOB_GROWTH: name: Mob büyümesini duraklat description: |- @@ -1614,11 +1614,11 @@ protection: TURTLE_EGGS: description: Kırılmayı değiş. name: Kaplumbağa yumurtası - hint: Turtle eggs cannot be crushed! + hint: Kaplumbağa yumurtaları ezilemez! FROST_WALKER: - description: Kığırlaştırıcı büyüsünü kapat/aç. - name: Kığırlaştırıcı - hint: Frost Walker cannot be used here + description: Buz Yürüyücü büyüsünü kapat/aç. + name: Buz Yürüyücü + hint: Buz Yürüyücü burada kullanılamaz EXPERIENCE_PICKUP: name: XP yerden al description: XP alışını değiş. @@ -1630,21 +1630,21 @@ protection: adaya geri dönme komudunu engeller. hint: 'Adandan aşağaya düşerken adana geri ışınlanamazsın!' VISITOR_KEEP_INVENTORY: - name: Ziyaretçiler ölümle ilgili envanter tutuyor + name: Ziyaretçiler ölümde envanterini korur description: |- - Prevent players from losing their - items and experience if they die on - an island in which they are a visitor. + Ziyaretçi olarak bulundukları bir adada + ölen oyuncuların eşyalarını ve + deneyim puanlarını kaybetmesini önler. - Island members still lose their items - if they die on their own island! + Ada üyeleri kendi adalarında ölürse + eşyalarını kaybetmeye devam eder! SPAWN_PROTECTION: - name: Spawn island void protection + name: Doğma adası boşluk koruması description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Etkinleştirildiğinde, doğma adasında + boşluğa düşen oyuncular ölmek + yerine doğma noktasına geri + ışınlanır. RAID_TRIGGER: name: Baskın tetikleyici description: Baskın tetiklemek için gereken minimum ada rütbesini belirler @@ -1653,7 +1653,7 @@ protection: name: Varlık portal kullanımı description: |- Varlıkların (oyuncu olmayan) boyutlar arasında - teleporto olmak için portalları + teleport olmak için portalları kullanıp kullanamayacağını açık/kapalı yapar WIND_CHARGE: name: Rüzgar şarjı @@ -1669,9 +1669,9 @@ protection: ve adalara hasar verebilir. WORLD_BLOCK_EXPLODE_DAMAGE: description: |- - Allow Bed & Respawn Anchors - to break blocks and damage - entities outside of island limits. + Yatak ve Yeniden Doğma Çapalarının + ada sınırları dışındaki blokları + kırmasına ve varlıklara zarar vermesine izin ver. name: Dünya bloğu patlama hasarı WORLD_TNT_DAMAGE: description: |- @@ -1754,7 +1754,7 @@ protection: description-layout: | [description] - Allowed for: + İzin verilenler: allowed-rank: '- [rank]' blocked-rank: '- ' minimal-rank: '- [rank]' @@ -1775,7 +1775,7 @@ management: description: 'Tıkla ve yüklü oyun modlarını gör.' blueprints: name: 'Taslaklar' - description: 'Opens the Admin Blueprint menu.' + description: 'Yönetici Taslak menüsünü açar.' gamemode: name: '[name]' description: | @@ -1845,8 +1845,8 @@ catalog: gamemodes: name: 'Oyun Modları' description: | - Click to browse through the - available official Gamemodes. + Tıkla mevcut resmi Oyun Modlarına + göz atmak için. addons: name: 'Eklentiler' description: | @@ -1894,12 +1894,12 @@ enums: THORNS: Dikenler DRAGON_BREATH: Ejderha Nefesi CUSTOM: Özel - FLY_INTO_WALL: Duvara Yapışma + FLY_INTO_WALL: Duvara Uçma HOT_FLOOR: Sıcak Zemin CRAMMING: Sıkışma DRYOUT: Kuruma FREEZE: Donma - KILL: Öldür + KILL: Öldürme SONIC_BOOM: Sonik patlama WORLD_BORDER: Dünya Sınırı panel: @@ -1907,7 +1907,7 @@ panel: title: '[name] Emeği geçenler' contributor: name: '[name]' - description: 'Commits: [commits]' + description: 'Katkılar: [commits]' empty-here: name: 'Burası boş gibi gözüküyor...' description: |- @@ -1941,7 +1941,7 @@ panels: author: '- [name]' selected: 'Şu anda seçili.' placeholder: - title: 'Placeholder Browser' + title: 'Yer Tutucu Tarayıcısı' buttons: bentobox: name: 'BentoBox' @@ -1983,7 +1983,7 @@ panels: name: 'Önceki Sayfa' description: '[number] sayfaya geçiş yap' next: - name: 'Son Sayfa' + name: 'Sonraki Sayfa' description: '[number] sayfaya geç' tips: click-to-next: 'Tıkla sonraki için.' From 5de0f4e68d9adae7b001a3d0feb1feafebd5c6c0 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:21:46 -0700 Subject: [PATCH 24/95] Fix Vietnamese (vi.yml) locale: translate English strings, fix typos and wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English: maxsize section, switch/switchto, setrange, tp, getrank, setrank, setspawn, setspawnpoint, settings, blueprint rename, delete, why debug, SPAWN_PROTECTION flag, max-homes, trash count, out-of-range, use-switch, too-long - Remove AI response from perm-not-required ("Sure! Please provide...") - Fix typos: thẩy->thấy, lời mồi->lời mời, Đống góp->Đóng góp, tương tắt->tương tác, đệ->để, Sát thường->Sát thương, đống góp->đóng góp - Fix wrong translations: bồn rửa->chìm (sink as sinking), Hiện ra dệt->Khung dệt (Loom), Mài đá->Bệ mài (Grindstone), ám lực->áp lực (pressure), tủ ong->tổ ong (beehive), Thế Giới Địa Ngục->Thế Giới Kết Thúc (The End sethome context) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/vi.yml | 133 +++++++++++++++--------------- 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/src/main/resources/locales/vi.yml b/src/main/resources/locales/vi.yml index 0cd793707..a43b67386 100644 --- a/src/main/resources/locales/vi.yml +++ b/src/main/resources/locales/vi.yml @@ -25,7 +25,7 @@ general: player-has-island: 'Người chơi đã có đảo!' player-has-no-island: 'Người chơi không có đảo!' already-have-island: 'Bạn đã có đảo!' - no-safe-location-found: 'Không tìm thẩy điểm an toàn để dịch chuyển.' + no-safe-location-found: 'Không tìm thấy điểm an toàn để dịch chuyển.' not-owner: 'Bạn không phải chủ đảo!' player-is-not-owner: '[name] không phải chủ đảo!' not-in-team: 'Người chơi đó không có ở đội của bạn!' @@ -189,10 +189,10 @@ commands: Cảnh báo: người chơi này hiện đang sở hữu [number] hòn đảo. Đây là nhiều hơn mức cho phép theo cài đặt hoặc quyền: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: đặt kích thước đội tối đa cho [prefix_island] của người chơi (dùng 0 để đặt lại về mặc định) + success: 'Đã đặt kích thước đội tối đa của [prefix_island] [name] thành [number].' + reset: 'Đã đặt lại kích thước đội tối đa của [prefix_island] [name] về mặc định ([number]).' range: description: lệnh độ dài cho quản trị viên invalid-value: @@ -263,7 +263,7 @@ commands: last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: 'Chết: [number]' resets-left: 'Lần làm lại: [number] (Tối đa: [total])' - max-homes: 'Max homes: [number]' + max-homes: 'Số nhà tối đa: [number]' team-members-title: 'Thành viên đảo:' team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -288,26 +288,26 @@ commands: switch: description: bật/tắt bỏ qua bảo vệ op: 'Các Ops luôn có thể vượt qua sự bảo vệ. Deop để sử dụng lệnh.' - removing: Removing protection bypass... - adding: Adding protection bypass... + removing: 'Đang tắt bỏ qua bảo vệ...' + adding: 'Đang bật bỏ qua bảo vệ...' switchto: - parameters: - description: switch player's island to the numbered one in trash + parameters: + description: chuyển đảo của người chơi sang đảo được đánh số trong thùng rác out-of-range: >- - Number must be between 1 and [number]. Use [label] trash [player] - to see island numbers + Số phải nằm trong khoảng 1 đến [number]. Dùng [label] trash [player] + để xem số đảo cannot-switch: 'Chuyển đổi không thành công. Xem nhật ký điều khiển để biết lỗi.' - success: 'Successfully switched the player''s island to the specified one.' + success: 'Đã chuyển đảo của người chơi sang đảo được chỉ định.' trash: no-unowned-in-trash: 'Không có hòn đảo không có chủ trong thùng rác' no-islands-in-trash: 'Người chơi không có đảo nào trong thùng rác.' parameters: '[Người chơi]' description: hiển thị các đảo không sở hữu hoặc đảo của người chơi trong thùng rác title: '=========== Các Đảo Trong Rác ===========' - count: 'Island [number]:' + count: 'Đảo [number]:' use-switch: >- - Use [label] switchto to switch player to - island in trash + Dùng [label] switchto để chuyển người chơi sang + đảo trong thùng rác use-emptytrash: >- Sử dụng [label] emptytrash [player]để xóa vĩnh viễn các vật phẩm rác @@ -320,9 +320,9 @@ commands: version: description: hiển thị phiên bản BentoBox và các addon setrange: - parameters: - description: set the range of player's island - range-updated: 'Island range updated to [number].' + parameters: <Độ dài> + description: đặt phạm vi đảo của người chơi + range-updated: 'Đã cập nhật phạm vi đảo thành [number].' placeholders: description: mở trình duyệt trình giữ chỗ dump-placeholders: @@ -332,8 +332,8 @@ commands: reload: description: 'Tải lại' tp: - parameters: [player to teleport] - description: teleport to a player's island + parameters: [người chơi để dịch chuyển] + description: dịch chuyển đến đảo của người chơi manual: >- Không tìm thấy warp an toàn! Tự tay tp gần [location] và kiểm tra nó. @@ -343,15 +343,15 @@ commands: người chơi] description: dịch chuyển một người chơi đến [prefix_island] của người chơi khác getrank: - parameters: [island owner] - description: get a player's rank on their island or the island of the owner - rank-is: 'Rank is [rank] on [name]''s island.' + parameters: [chủ đảo] + description: xem hạng của người chơi trên đảo của họ hoặc đảo của chủ + rank-is: 'Hạng là [rank] trên đảo của [name].' setrank: - parameters: [island owner] - description: set a player's rank on their island or the island of the owner + parameters: [chủ đảo] + description: đặt hạng của người chơi trên đảo c��a họ hoặc đảo của chủ unknown-rank: 'Hạng không xác định!' not-possible: 'Hạng phải cao hơn khách tham quan.' - rank-set: 'Rank set from [from] to [to] on [name]''s island.' + rank-set: 'Đã đặt hạng t�� [from] thành [to] trên đảo của [name].' setprotectionlocation: parameters: '[toạ độ x y z]' description: đặt vị trí hiện tại hoặc [x y z] là điểm giữa khu vực bảo vệ @@ -362,22 +362,22 @@ commands: island-location-changed: '[user] đổi điểm giữa bảo vệ thành [xyz].' xyz-error: 'Xác định 3 toạ độ: ví dụ 100 120 100' setspawn: - description: set an island as spawn for this gamemode - already-spawn: 'This island is already a spawn!' - no-island-here: 'There is no island here.' - confirmation: 'Are you sure you want to set this island as the spawn for this world?' - success: 'Successfully set this island as the spawn for this world.' + description: đặt một đảo làm điểm hồi sinh cho chế độ này + already-spawn: 'Đảo này đã là điểm hồi sinh!' + no-island-here: 'Không có đảo ở đây.' + confirmation: 'Bạn có chắc muốn đặt đảo này làm điểm hồi sinh cho thế giới này không?' + success: 'Đã đặt thành công đảo này làm điểm hồi sinh cho thế giới này.' setspawnpoint: - description: set current location as spawn point for this island - no-island-here: 'There is no island here.' + description: đặt vị trí hiện tại làm điểm hồi sinh cho đ��o này + no-island-here: 'Không có đảo ở đây.' confirmation: >- Bạn có chắc chắn muốn đặt vị trí này làm điểm spawn cho hòn đảo này không? - success: 'Successfully set this location as the spawn point for this island.' - island-spawnpoint-changed: '[user] changed this island spawn point.' + success: 'Đã đặt thành công vị trí này làm điểm hồi sinh cho đảo này.' + island-spawnpoint-changed: '[user] đã thay đổi điểm hồi sinh của đảo này.' settings: parameters: '[player]' - description: open system settings or island settings for player + description: mở cài đặt hệ thống hoặc cài đặt đảo cho người chơi unknown-setting: 'Tuỳ chỉnh không tồn tại' blueprint: parameters: @@ -403,7 +403,7 @@ commands: sink: description: đặt bản thiết kế này để chìm xuống đáy đại dương khi được dán vào status: 'Bản vẽ sẽ [status] khi được dán' - sink: 'bồn rửa' + sink: 'chìm' not-sink: 'không chìm' no-clipboard: >- Không có bản thiết kế nào trong bảng diễn. Tải lên hoặc sao chép @@ -438,7 +438,7 @@ commands: rename: parameters: description: đặt tên lại một bản thiết kế - success: 'Blueprint [old] has been successfully renamed to [name].' + success: 'Bản thiết kế [old] đã được đổi tên thành [name].' pick-different-name: 'Vui lòng chỉ định một tên khác với tên hiện tại của bản thiết kế.' management: back: Trở lại @@ -459,7 +459,7 @@ commands: no-permission: Không có quyền perm-required: Yêu cầu no-perm-required: Không thể thiết lập quyền cho gói mặc định - perm-not-required: Sure! Please provide the text you'd like me to translate. + perm-not-required: Không yêu cầu perm-format: '' remove: Nhấn chuột phải để xóa blueprint-instruction: |- @@ -472,7 +472,7 @@ commands: name: quit: quit prompt: Nhập một tên, hoặc 'quit' để thoát - too-long: 'Too long' + too-long: 'Quá dài' pick-a-unique-name: Xin hãy chọn một cái tên độc đáo hơn. stripped-char-in-unique-name: >- Một số ký tự đã bị xóa vì chúng không được phép. ID mới sẽ là @@ -531,12 +531,11 @@ commands: world: description: Quản lý cài đặt thế giới delete: - parameters: - description: deletes a player's island + parameters: + description: xóa đảo của người chơi cannot-delete-owner: >- - All island members have to be kicked from the island before deleting - it. - deleted-island: 'Island at [xyz] has been successfully deleted.' + Tất cả thành viên đảo phải bị đuổi khỏi đảo trước khi xóa. + deleted-island: 'Đảo tại [xyz] đã được xóa thành công.' deletehomes: parameters: description: xoá toàn bộ nhà trong đảo @@ -544,8 +543,8 @@ commands: why: parameters: description: bật báo cáo gỡ lỗi bảo vệ bảng điều khiển - turning-on: Turning on console debug for [name]. - turning-off: Turning off console debug for [name]. + turning-on: 'Đang bật gỡ lỗi bảng điều khiển cho [name].' + turning-off: 'Đang tắt gỡ lỗi bảng điều khiển cho [name].' deaths: description: biên tập số lần chết của người chơi reset: @@ -729,8 +728,8 @@ commands: not-allowed: 'Bạn không được phép chọn điểm nhà ở Địa Ngục.' confirmation: 'Bạn có chắc muốn chọn điểm nhà ở Địa Ngục?' the-end: - not-allowed: 'Bạn không được phép chọn điểm nhà ở Thế Giới Địa Ngục.' - confirmation: 'Bạn có chắc muốn chọn điểm nhà ở Thế Giới Địa Ngục?' + not-allowed: 'Bạn không được phép chọn điểm nhà ở Thế Giới Kết Thúc.' + confirmation: 'Bạn có chắc muốn chọn điểm nhà ở Thế Giới Kết Thúc?' parameters: '[số nhà]' setname: description: đặt tên cho đảo bạn @@ -841,7 +840,7 @@ commands: invite: description: mời người chơi vào đảo của bạn invitation-sent: 'Lời mời đã gửi tới [name].' - removing-invite: 'Đang xóa lời mồi.' + removing-invite: 'Đang xóa lời mời.' name-has-invited-you: '[name] đã mời bạn vào đảo họ.' to-accept-or-reject: >- Dùng /[label] team accept để chấp nhận, hoặc /[label] team reject @@ -1126,7 +1125,7 @@ protection: description: Bật/Tắt tương tác với thùng ủ phân hint: Tương tác với thùng ủ phân đã tắt LOOM: - name: Hiện ra dệt + name: Khung dệt description: Chuyển đổi sử dụng hint: Truy cập khung dệt đã bị vô hiệu hóa FLOWER_POT: @@ -1134,7 +1133,7 @@ protection: description: Bật/Tắt tương tác với chậu hoa hint: Tương tác với chậu hoa đã tắt GRINDSTONE: - name: Mài đá + name: Bệ mài description: Chuyển đổi sử dụng hint: Truy cập bệ mài đã bị vô hiệu hóa SHULKER_BOX: @@ -1350,7 +1349,7 @@ protection: hint: Cắt gặt cây trồng đã bị vô hiệu hóa HIVE: description: 'Bật/Tắt thu hoạch tổ ong.' - name: Thu hoạch tủ ong + name: Thu hoạch tổ ong hint: Đã tắt thu hoạch tổ ong HURT_TAMED_ANIMALS: description: >- @@ -1488,7 +1487,7 @@ protection: NOTE_BLOCK: description: Bật/Tắt sử dụng name: Khối nốt nhạc - hint: Đã tắt tương tắt với khối nốt nhạc + hint: Đã tắt tương tác với khối nốt nhạc OBSIDIAN_SCOOPING: name: Xúc hắc diệm thạch description: |- @@ -1564,8 +1563,8 @@ protection: hint: Tạm dừng tăng trưởng mob đã tắt PRESSURE_PLATE: description: Bật/Tắt sử dụng - name: Đĩa cảm biến ám lực - hint: Đã tắt sử dụng đĩa cảm biến ám lực + name: Đĩa cảm biến áp lực + hint: Đã tắt sử dụng đĩa cảm biến áp lực PVP_END: description: |- Bật/Tắt PVP @@ -1697,12 +1696,12 @@ protection: Thành viên đảo vẫn mất đồ nếu họ chết ở đảo của họ! SPAWN_PROTECTION: - name: Spawn island void protection + name: Bảo vệ hư vô đảo hồi sinh description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Khi bật, người chơi rơi vào + hư vô tại đảo hồi sinh + sẽ được dịch chuyển về + điểm hồi sinh thay vì chết. RAID_TRIGGER: name: Kích hoạt cuộc đột kích description: Đặt cấp độ đảo tối thiểu cần thiết để kích hoạt cuộc đột kích @@ -1736,7 +1735,7 @@ protection: Cho phép TNT và xe mỏ có TNT phá khối gây sát thương lên khối và thực thể ở ngoài đảo. - name: Sát thường từ TNT ngoài đảo + name: Sát thương từ TNT ngoài đảo locked: 'Đảo đã khóa!' locked-island-bypass: '[prefix_Island] này đã bị khóa, nhưng bạn có quyền đi qua.' protected: 'Đảo đã bảo vệ: [description].' @@ -1887,7 +1886,7 @@ management: name: 'Mục lục tiện ích' description: 'Mở mục lục tiện ích' credits: - name: 'Đống góp' + name: 'Đóng góp' description: 'Mở menu đóng góp cho BentoBox' empty-here: name: 'Hơi trống ở đây...' @@ -1903,7 +1902,7 @@ management: phần mềm và phiên bản TƯƠNG THÍCH . Tất cả tính năng được tạo - đệ chạy trên môi trường này. + để chạy trên môi trường này. SUPPORTED: | Đang chạy [name] [version]. @@ -2000,14 +1999,14 @@ enums: WORLD_BORDER: Biên Giới Thế Giới panel: credits: - title: '[name] Đống góp' + title: '[name] Đóng góp' contributor: name: '[name]' description: 'Cam kết: [commits]' empty-here: name: 'Hơi trống ở đây...' description: | - BentoBox không thể lấy người đống góp + BentoBox không thể lấy người đóng góp cho tiện ích này. Cho phép BentoBox kết nối GitHub trong From 34aa40f238463031bf3ad3eae8fd9fd77d55c73b Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:22:08 -0700 Subject: [PATCH 25/95] Fix Indonesian (id.yml) locale: broken color codes, untranslated strings, wrong translations, translated placeholders - Fix ~50 broken legacy color codes (&sebuah, & satu, etc.) replaced with proper MiniMessage tags across flag descriptions (CONTAINER, BLOCK_EXPLODE_DAMAGE, CLEAN_SUPER_FLAT, CREEPER_DAMAGE, ENDERMAN_DEATH_DROP, GEO_LIMIT_MOBS, HARVEST, PISTON_PUSH, TREES_GROWING_OUTSIDE_RANGE, WITHER_DAMAGE, etc.) - Translate untranslated English: maxsize section, SPAWN_PROTECTION flag, Max homes - Fix translated placeholders back to English: [nama]->[name], [angka]->[number], [deskripsi]->[description], [pengguna]->[user], [versi]->[version], [peringkat]->[rank], [pengaturan]->[setting], [berikutnya]->[next], [nama_dunia]->[world_name], [tambahan]->[addon], [dunia]->[worlds], [mode permainan]->[gamemode] - Fix wrong translations: PVT->PVP, cat dasar->pemasangan sumbu (TNT priming), Buah paduan suara->Buah Chorus, gerbong->Hopper, Perapian->Tungku, Kebiasaan->Kustom, SKS->Kredit, Mengurung->Coop, Serangan Massa->Serangan Entitas, Batu Merah Luar Talian->Redstone Offline, Tempat pembuatan bir->ramuan, Kerusakan Dada->Kerusakan Peti, Bibit dilindungi->Spawn dilindungi - Fix broken flag-item name-layout and contributor name from '&sebuah nama]' to proper '[name]' - Fix broken reset-to-default description with truncated 'ilai bawaan' - Fix dimension-done and see-console-for-status broken color codes - Fix team fix done from '& Pemindaian' to proper tagged string Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/id.yml | 360 +++++++++++++++--------------- 1 file changed, 179 insertions(+), 181 deletions(-) diff --git a/src/main/resources/locales/id.yml b/src/main/resources/locales/id.yml index b0084f0c8..f92dbcadb 100644 --- a/src/main/resources/locales/id.yml +++ b/src/main/resources/locales/id.yml @@ -121,9 +121,7 @@ commands: number-error: 'Argumen harus beberapa hari' confirm: 'Ketik /[label] purge konfirmasi untuk memulai pembersihan' completed: 'Pembersihan dihentikan.' - see-console-for-status: >- - & Pembersihan dimulai. Lihat konsol untuk status atau gunakan - /[label] purge status. + see-console-for-status: 'Pembersihan dimulai. Lihat konsol untuk status atau gunakan /[label] purge status.' no-purge-in-progress: 'Saat ini tidak ada pembersihan yang sedang berlangsung.' regions: parameters: '[days]' @@ -165,11 +163,11 @@ commands: description: memindai dan memperbaiki keanggotaan lintas pulau dalam database scanning: Memindai basis data... duplicate-owner: 'Pemain memiliki lebih dari satu pulau di database: [name]' - player-has: 'Pemain [nama] memiliki [nomor] pulau' + player-has: 'Pemain [name] memiliki [number] pulau' duplicate-member: 'Pemain [name] adalah anggota lebih dari satu pulau di database' rank-on-island: '[rank] di pulau di [xyz]' fixed: 'Tetap' - done: '& Pemindaian' + done: 'Pemindaian' kick: parameters: description: menendang pemain dari tim @@ -193,10 +191,10 @@ commands: Peringatan: pemain ini sekarang memiliki [number] pulau. Ini lebih dari yang diizinkan oleh pengaturan atau izin: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Atur ukuran tim maksimum untuk [prefix_island] pemain (gunakan 0 untuk mengatur ulang ke default dunia) + success: 'Atur ukuran tim maksimum [prefix_island] [name] menjadi [number].' + reset: 'Atur ulang ukuran tim maksimum [prefix_island] [name] ke default dunia ([number]).' range: description: perintah jangkauan pulau admin invalid-value: @@ -224,7 +222,7 @@ commands: reset: parameters: description: mengatur ulang rentang pulau yang dilindungi ke default dunia - success: 'Setel ulang rentang perlindungan pulau ke [angka].' + success: 'Setel ulang rentang perlindungan pulau ke [number].' add: description: meningkatkan jangkauan pulau yang dilindungi parameters: @@ -241,7 +239,7 @@ commands: parameters: description: daftarkan pemain ke pulau tak berpemilik tempat Anda berada registered-island: 'Terdaftar [name] ke pulau di [xyz].' - reserved-island: 'Pulau yang dilindungi di [xyz] untuk [nama].' + reserved-island: 'Pulau yang dilindungi di [xyz] untuk [name].' already-owned: 'Pulau sudah dimiliki oleh pemain lain!' no-island-here: 'Tidak ada pulau di sini. Konfirmasikan untuk membuatnya.' in-deletion: 'Ruang pulau ini sedang dihapus. Coba nanti.' @@ -272,7 +270,7 @@ commands: last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: 'Kematian: [number]' resets-left: 'Reset: [number] (Maks: [total])' - max-homes: 'Max homes: [number]' + max-homes: 'Rumah maksimum: [number]' team-members-title: 'Anggota Tim:' team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -291,7 +289,7 @@ commands: protection-coords: 'Koordinat perlindungan: [xz1] hingga [xz2]' is-spawn: Pulau adalah pulau bibit banned-players: 'Pemain yang dilarang:' - banned-format: '[nama]' + banned-format: '[name]' unowned: 'Tidak dimiliki' bundle: 'Paket Blueprint yang digunakan untuk membuat pulau: [name]' switch: @@ -372,7 +370,7 @@ commands: confirmation: 'Apakah Anda yakin ingin menetapkan [xyz] sebagai pusat perlindungan?' success: 'Berhasil menetapkan [xyz] sebagai pusat perlindungan.' fail: 'Gagal menetapkan [xyz] sebagai pusat perlindungan.' - island-location-changed: '[pengguna] mengubah pusat perlindungan pulau menjadi [xyz].' + island-location-changed: '[user] mengubah pusat perlindungan pulau menjadi [xyz].' xyz-error: 'Tentukan tiga koordinat bilangan bulat: misalnya 100 120 100' setspawn: description: tetapkan pulau sebagai tempat bertelur untuk mode permainan ini @@ -391,7 +389,7 @@ commands: Apakah Anda yakin ingin menetapkan lokasi ini sebagai titik pemijahan pulau ini? success: 'Berhasil menetapkan lokasi ini sebagai titik pemijahan pulau ini.' - island-spawnpoint-changed: '[pengguna] mengubah titik spawn pulau.' + island-spawnpoint-changed: '[user] mengubah titik spawn pulau.' settings: parameters: >- [player]/[world flag]/spawn-island [flag/active/disable] @@ -607,8 +605,8 @@ commands: locales-reloaded: '[prefix_bentobox]Bahasa dimuat ulang.' addons-reloaded: '[prefix_bentobox]Tambahan dimuat ulang.' settings-reloaded: '[prefix_bentobox]Pengaturan dimuat ulang.' - addon: '[prefix_bentobox]Memuat ulang [nama].' - addon-reloaded: '[prefix_bentobox][nama] dimuat ulang.' + addon: '[prefix_bentobox]Memuat ulang [name].' + addon-reloaded: '[prefix_bentobox][name] dimuat ulang.' warning: >- [prefix_bentobox]Peringatan: Memuat ulang dapat menyebabkan ketidakstabilan, jadi jika Anda melihat kesalahan setelahnya, mulai @@ -622,7 +620,7 @@ commands: loaded-addons: 'Add-on yang Dimuat:' loaded-game-worlds: 'Dunia Game yang Dimuat:' addon-syntax: '[name] [version] ([state])' - game-world: '[nama] ([tambahan]): [dunia]' + game-world: '[name] ([addon]): [worlds]' server: 'Menjalankan [name] [version].' database: 'Basis Data: [database]' manage: @@ -641,7 +639,7 @@ commands: players: '[prefix_bentobox]Memigrasikan pemain' names: '[prefix_bentobox]Memigrasikan nama' addons: '[prefix_bentobox]Memigrasi add-on' - class: '[prefix_bentobox]Migrasi [deskripsi]' + class: '[prefix_bentobox]Migrasi [description]' migrated: '[prefix_bentobox]Bermigrasi' completed: '[prefix_bentobox]Selesai' rank: @@ -695,9 +693,9 @@ commands: mereka [prefix_island]. pasting: estimated-time: 'Perkiraan waktu: [number] detik.' - blocks: 'Membangunnya blok demi blok: [angka] blok semuanya...' + blocks: 'Membangunnya blok demi blok: [number] blok semuanya...' entities: 'Mengisinya dengan entitas: [number] entitas di semua...' - dimension-done: '&sebuah Pulau di [world] dibangun.' + dimension-done: '[prefix_Island] di [world] dibangun.' done: 'Selesai! Pulau Anda sudah siap dan menunggu Anda!' pick: 'Pilih pulau' cannot-afford: 'Anda tidak mampu membeli ini! Biaya: [cost]' @@ -738,7 +736,7 @@ commands: Tidak ada jalan untuk kembali: setelah pulau Anda saat ini dihapus, tidak ada cara untuk mengambilnya kembali nanti. kicked-from-island: >- - Anda dikeluarkan dari pulau Anda dalam [mode permainan] karena + Anda dikeluarkan dari pulau Anda dalam [gamemode] karena pemiliknya menyetel ulang. sethome: description: atur titik teleportasi rumah Anda @@ -758,7 +756,7 @@ commands: setname: description: tetapkan nama untuk pulau Anda name-too-short: 'Terlalu pendek. Ukuran minimum adalah [number] karakter.' - name-too-long: 'Terlalu panjang. Ukuran maksimum adalah [angka] karakter.' + name-too-long: 'Terlalu panjang. Ukuran maksimum adalah [number] karakter.' name-already-exists: 'Sudah ada pulau dengan nama itu di mode permainan ini.' parameters: success: 'Berhasil menetapkan nama pulau Anda menjadi [name].' @@ -822,7 +820,7 @@ commands: Anggota: [total]/[max] Anggota daring: [online] rank-layout: - owner: '[peringkat]:' + owner: '[rank]:' generic: '[rank] ([number]):' coop: description: buat peringkat coop pemain di pulaumu @@ -851,11 +849,11 @@ commands: parameters: trust-in-yourself: 'Percayalah pada dirimu sendiri!' name-has-invited-you: >- - [nama] telah mengundang Anda untuk bergabung sebagai anggota + [name] telah mengundang Anda untuk bergabung sebagai anggota tepercaya di pulau mereka. player-already-trusted: 'Pemain sudah dipercaya!' you-are-trusted: 'Anda dipercaya oleh [name]!' - success: 'Anda mempercayai [nama].' + success: 'Anda mempercayai [name].' is-full: 'Anda tidak bisa mempercayai orang lain. Awasi punggungmu!' untrust: description: hapus peringkat pemain tepercaya dari pemain @@ -982,8 +980,8 @@ commands: Anda telah mencapai batas larangan, Anda tidak dapat melarang pemain lain lagi dari pulau Anda. player-already-banned: 'Pemain sudah diblokir.' - player-banned: '[nama]sekarang dilarang di pulau Anda.' - owner-banned-you: '[nama]melarang Anda memasuki pulau mereka!' + player-banned: '[name] sekarang dilarang di pulau Anda.' + owner-banned-you: '[name] melarang Anda memasuki pulau mereka!' you-are-banned: 'Anda dilarang memasuki pulau ini!' unban: description: batalkan pelarangan pemain dari pulau Anda @@ -991,13 +989,13 @@ commands: cannot-unban-yourself: 'Anda tidak dapat membatalkan pemblokiran diri Anda sendiri!' player-not-banned: 'Pemain tidak dilarang.' player-unbanned: '[name]kini tidak diblokir lagi di pulau Anda.' - you-are-unbanned: '[nama]membatalkan pemblokiran Anda dari pulau mereka!' + you-are-unbanned: '[name] membatalkan pemblokiran Anda dari pulau mereka!' banlist: description: daftar pemain yang dilarang noone: 'Tidak ada yang dilarang di pulau ini.' the-following: 'Pemain berikut dilarang:' names: '[line]' - you-can-ban: 'Anda dapat melarang hingga [angka] lebih banyak pemain.' + you-can-ban: 'Anda dapat melarang hingga [number] lebih banyak pemain.' settings: description: menampilkan pengaturan pulau language: @@ -1012,8 +1010,8 @@ commands: cannot-expel: 'Pemain itu tidak bisa dikeluarkan.' cannot-expel-member: 'Anda tidak dapat mengeluarkan anggota tim!' not-on-island: 'Pemain itu tidak ada di pulau Anda!' - player-expelled-you: '[nama]mengusirmu dari pulau!' - success: 'Anda mengusir [nama] dari pulau.' + player-expelled-you: '[name] mengusirmu dari pulau!' + success: 'Anda mengusir [name] dari pulau.' lock: description: kunci atau buka kunci [prefix_island] Anda locked: '[prefix_island] Anda sekarang terkunci.' @@ -1024,7 +1022,7 @@ ranks: sub-owner: Sub-Pemilik member: Anggota trusted: Tepercaya - coop: Mengurung + coop: Coop visitor: Pengunjung banned: Dilarang admin: Admin @@ -1100,12 +1098,12 @@ protection: hint: Peternakan hewan dilindungi BREWING: description: Alihkan interaksi - name: Tempat pembuatan bir - hint: Pembuatan bir dinonaktifkan + name: Tempat pembuatan ramuan + hint: Pembuatan ramuan dinonaktifkan BUCKET: description: Alihkan interaksi name: ember - hint: Penggunaan keranjang dinonaktifkan + hint: Penggunaan ember dinonaktifkan BUTTON: description: Alihkan penggunaan tombol name: Tombol @@ -1127,10 +1125,10 @@ protection: description: |- Alihkan interaksi dengan semua penampung. Termasuk: Barel, sarang lebah, tempat pembuatan bir, - & peti, komposter, dispenser, penetes, - & pot bunga, tungku, hopper, bingkai barang, - &sebuah jukebox, peti kereta tambang, kotak shulker, - & dada yang terperangkap. + peti, komposter, dispenser, penetes, + pot bunga, tungku, hopper, bingkai barang, + jukebox, peti kereta tambang, kotak shulker, + peti yang terperangkap. Mengubah penggantian pengaturan individual bendera ini. @@ -1141,7 +1139,7 @@ protection: Beralih interaksi dengan peti dan kereta tambang peti. (tidak termasuk peti yang terperangkap) - hint: Akses dada dinonaktifkan + hint: Akses peti dinonaktifkan BARREL: name: barel description: Alihkan interaksi barel @@ -1154,8 +1152,8 @@ protection: description: |- Izinkan Tempat Tidur & Respawn Jangkar untuk memecahkan blok dan merusak - &sebuah entitas. - name: Blokir kerusakan ledakan + entitas. + name: Kerusakan ledakan blok COMPOSTER: name: Komposter description: Alihkan interaksi komposter @@ -1191,8 +1189,8 @@ protection: hint: Akses pemotongan batu dinonaktifkan TRAPPED_CHEST: name: Peti yang terperangkap - description: Alihkan interaksi dada yang terjebak - hint: Akses dada yang terjebak dinonaktifkan + description: Alihkan interaksi peti yang terperangkap + hint: Akses peti yang terperangkap dinonaktifkan DISPENSER: name: Dispenser description: Alihkan interaksi dispenser @@ -1206,27 +1204,27 @@ protection: description: Alihkan elytra diperbolehkan atau tidak hint: 'PERINGATAN: Elytra tidak dapat digunakan di sini!' HOPPER: - name: gerbong + name: Hopper description: Alihkan interaksi hopper hint: Interaksi hopper dinonaktifkan CHEST_DAMAGE: - description: Alihkan kerusakan dada akibat ledakan - name: Kerusakan Dada + description: Alihkan kerusakan peti akibat ledakan + name: Kerusakan Peti CHORUS_FRUIT: description: Alihkan teleportasi - name: Buah paduan suara - hint: Teleportasi buah paduan suara dinonaktifkan + name: Buah Chorus + hint: Teleportasi buah Chorus dinonaktifkan CLEAN_SUPER_FLAT: description: |- Aktifkan untuk membersihkan apa pun - & potongan super datar - &sebuah dunia pulau + potongan super datar di + dunia [prefix_island] name: Bersih Super Datar COARSE_DIRT_TILLING: description: |- - Alihkan pengolahan kasar - &sebuah podzol yang kotor dan pecah - untuk mendapatkan kotoran + Alihkan pengolahan tanah kasar + dan pemecahan podzol + untuk mendapatkan tanah name: Pengolahan tanah kasar hint: Tidak ada tanah kasar yang diolah COLLECT_LAVA: @@ -1256,18 +1254,18 @@ protection: hint: Akses meja kerja dinonaktifkan CREEPER_DAMAGE: description: | - Alihkan tanaman menjalar - & perlindungan kerusakan - name: Perlindungan kerusakan menjalar + Alihkan kerusakan + creeper. + name: Kerusakan creeper CREEPER_GRIEFING: description: | - Mengalihkan kesedihan yang menjalar - & perlindungan saat dinyalakan - oleh pengunjung pulau. - name: Perlindungan kesedihan yang menjalar - hint: Creeper berduka dinonaktifkan + Alihkan perlindungan griefing + creeper saat dinyalakan + oleh pengunjung [prefix_island]. + name: Perlindungan griefing creeper + hint: Griefing creeper dinonaktifkan CROP_PLANTING: - description: '&Satu Set yang bisa menanam benih.' + description: 'Atur siapa yang bisa menanam benih.' name: Penanaman tanaman hint: Penanaman tanaman dinonaktifkan CROP_TRAMPLE: @@ -1304,14 +1302,14 @@ protection: hint: Peti Ender dinonaktifkan di dunia ini ENDERMAN_DEATH_DROP: description: |- - Endermen akan jatuh - i blok mana pun mereka berada - &penahanan jika dibunuh. + Endermen akan menjatuhkan + blok apa pun yang mereka + pegang jika dibunuh. name: Penurunan Kematian Enderman ENDERMAN_GRIEFING: description: |- - Endermen dapat menghapus - & satu blok dari pulau + Endermen dapat mengambil + blok dari pulau name: Enderman berduka ENDERMAN_TELEPORT: description: |- @@ -1324,14 +1322,14 @@ protection: hint: Penggunaan Enderpearl dinonaktifkan ENTER_EXIT_MESSAGES: description: Menampilkan pesan masuk dan keluar - island: pulau [nama]. + island: pulau [name]. name: Masuk/Keluar pesan - now-entering: 'Sekarang masuk [nama].' + now-entering: 'Sekarang masuk [name].' now-entering-your-island: 'Sekarang memasuki pulau Anda.' - now-leaving: 'Sekarang meninggalkan [nama].' + now-leaving: 'Sekarang meninggalkan [name].' now-leaving-your-island: 'Sekarang tinggalkan pulau Anda.' EXPERIENCE_BOTTLE_THROWING: - name: Rasakan pengalaman melempar botol + name: Melempar botol pengalaman description: Beralih melempar botol pengalaman. hint: Botol pengalaman dinonaktifkan FIRE_BURNING: @@ -1361,12 +1359,12 @@ protection: name: batu dan baja description: |- Izinkan pemain menyalakan api atau - & api unggun menggunakan batu api dan baja - atau biaya kebakaran. + api unggun menggunakan batu api dan baja + atau muatan api. hint: Batu api dan baja serta muatan api dinonaktifkan FURNACE: description: Alihkan penggunaan - name: Perapian + name: Tungku hint: Penggunaan tungku dinonaktifkan GATE: description: Alihkan penggunaan @@ -1374,15 +1372,15 @@ protection: hint: Penggunaan gerbang dinonaktifkan GEO_LIMIT_MOBS: description: |- - Hapus massa yang pergi - & dilindungi dari luar - & ruang pulau + Hapus mob yang keluar + dari ruang [prefix_island] + yang dilindungi name: 'Batasi massa di pulau' HARVEST: description: |- - &Satu set yang bisa memanen tanaman. - Jangan lupa untuk mengizinkan item - & penjemputan juga! + Atur siapa yang bisa memanen tanaman. + Jangan lupa untuk mengizinkan pengambilan + item juga! name: Panen tanaman hint: Pemanenan tanaman dinonaktifkan HIVE: @@ -1394,7 +1392,7 @@ protection: Alihkan rasa sakit. Diaktifkan berarti bahwa hewan peliharaan dapat menerima damage. Dinonaktifkan berarti mereka tidak bisa terluka. name: Luka hewan peliharaan - hint: Hewan jinak melukai dinonaktifkan + hint: Menyakiti hewan jinak dinonaktifkan HURT_ANIMALS: description: Alihkan rasa sakit name: Menyakiti binatang @@ -1406,7 +1404,7 @@ protection: HURT_VILLAGERS: description: Alihkan rasa sakit name: Menyakiti penduduk desa - hint: Penduduk desa melukai orang cacat + hint: Menyakiti penduduk desa dinonaktifkan ITEM_FRAME: name: Bingkai Barang description: |- @@ -1415,8 +1413,8 @@ protection: hint: Penggunaan Bingkai Item dinonaktifkan ITEM_FRAME_DAMAGE: description: |- - Massa dapat merusak - & bingkai item + Mob dapat merusak + bingkai item name: Kerusakan Bingkai Barang INVINCIBLE_VISITORS: description: |- @@ -1464,8 +1462,8 @@ protection: LIMIT_MOBS: description: |- Batasi entitas dari - & pemijahan dalam game ini - & sebuah modus. + pemijahan dalam mode + permainan ini. name: 'Batasi pemijahan tipe entitas' can: 'Dapat bertelur' cannot: 'Tidak dapat muncul' @@ -1475,8 +1473,8 @@ protection: Beralih apakah cairan dapat mengalir ke luar dari jangkauan perlindungan pulau. Menonaktifkannya membantu menghindari lahar dan air - & batu besar yang menghasilkan di area antara - & dua pulau. + menghasilkan batu besar di area antara + dua [prefix_island]. Perhatikan bahwa cairan akan tetap mengalir secara vertikal. Mereka juga tidak akan menyebar secara horizontal jika @@ -1488,8 +1486,8 @@ protection: CHANGE_SETTINGS: name: Ubah pengaturan description: |- - Izinkan untuk berpindah anggota yang mana - &peran dapat mengubah pengaturan pulau. + Izinkan untuk berpindah peran anggota + yang mana dapat mengubah pengaturan [prefix_island]. MILKING: description: Alihkan pemerahan sapi name: Pemerahan @@ -1502,7 +1500,7 @@ protection: hint: Interaksi kereta tambang dinonaktifkan MONSTER_NATURAL_SPAWN: description: Alihkan pemijahan monster secara alami - name: Monster bertelur secara alami + name: Pemijahan monster alami MONSTER_SPAWNERS_SPAWN: description: Alihkan pemijahan monster dengan pemijahan name: Pemijahan monster @@ -1524,8 +1522,8 @@ protection: jangkauan perlindungan sebuah pulau. Perhatikan bahwa itu tidak mencegah makhluk - untuk bertelur melalui mob spawner atau spawn - & c telur. + untuk bertelur melalui mob spawner atau + telur spawn. NOTE_BLOCK: description: Alihkan penggunaan name: Blok catatan @@ -1561,19 +1559,19 @@ protection: di mana semua anggota sedang offline. Dapat membantu mengurangi kelambatan. Tidak memengaruhi pulau pemijahan. - name: Batu Merah Luar Talian + name: Redstone Offline PETS_STAY_AT_HOME: description: |- Saat aktif, hewan peliharaan yang dijinakkan hanya dapat pergi ke dan - tidak bisa meninggalkan milik pemiliknya - & pulau asal. + tidak bisa meninggalkan + [prefix_island] asal pemiliknya. name: Hewan Peliharaan Tetap Di Rumah PISTON_PUSH: description: |- Aktifkan ini untuk mencegah - & piston dari dorongan - &satu blok di luar pulau + piston mendorong + blok ke luar [prefix_island] name: Perlindungan Dorong Piston PLACE_BLOCKS: description: Alihkan penempatan @@ -1612,17 +1610,17 @@ protection: hint: Penggunaan pelat tekanan dinonaktifkan PVP_END: description: |- - Aktifkan/Nonaktifkan PVT - pada akhirnya. - name: Akhiri PVP - hint: PVP dinonaktifkan pada akhirnya - enabled: 'PVP di Akhir telah diaktifkan.' - disabled: 'PVP pada akhirnya telah dinonaktifkan.' + Aktifkan/Nonaktifkan PVP + di End. + name: PVP End + hint: PVP dinonaktifkan di End + enabled: 'PVP di End telah diaktifkan.' + disabled: 'PVP di End telah dinonaktifkan.' PVP_NETHER: description: |- Aktifkan/Nonaktifkan PVP di Nether. - name: PVT Bawah + name: PVP Nether hint: PVP dinonaktifkan di Nether enabled: 'PVP di Nether telah diaktifkan.' disabled: 'PVP di Nether telah dinonaktifkan.' @@ -1640,14 +1638,14 @@ protection: hint: Interaksi Redstone dinonaktifkan REMOVE_END_EXIT_ISLAND: description: |- - Mencegah keluarnya akhir - &sebuah pulau dari pembangkitan + Mencegah [prefix_island] keluar + akhir dari dibuat pada koordinat 0,0 name: Hapus pulau keluar ujung REMOVE_MOBS: description: |- - Hapus monster kapan - &teleportasi ke pulau + Dorong monster menjauh saat + berteleportasi ke pulau name: Hapus monster RIDING: description: Beralih berkendara @@ -1659,47 +1657,47 @@ protection: hint: Geser dinonaktifkan SPAWN_EGGS: description: Alihkan penggunaan - name: Menelurkan telur - hint: Telur bertelur dinonaktifkan + name: Telur spawn + hint: Telur spawn dinonaktifkan SPAWNER_SPAWN_EGGS: description: |- Memungkinkan untuk mengubah tipe entitas spawner menggunakan telur bibit. - name: Menelurkan telur pada spawner + name: Telur spawn pada spawner hint: >- mengubah tipe entitas pemijahan menggunakan telur pemijahan tidak diperbolehkan SCULK_SENSOR: description: |- - Mengaktifkan sensor sculk - & aktivasi. + Mengalihkan aktivasi + sensor sculk. name: Sensor Sculk hint: aktivasi sensor sculk dinonaktifkan SCULK_SHRIEKER: description: |- - Mengalihkan jeritan sculk - & aktivasi. + Mengalihkan aktivasi + sculk shrieker. name: Sculk Shrieker hint: aktivasi sculk shrieker dinonaktifkan SIGN_EDITING: description: |- Memungkinkan pengeditan teks tanda - name: Pengeditan Tanda Tangan + name: Pengeditan Papan Tanda hint: pengeditan tanda dinonaktifkan TNT_DAMAGE: description: |- Izinkan kereta tambang TNT dan TNT untuk memecahkan blok dan merusak - &sebuah entitas. + entitas. name: kerusakan TNT TNT_PRIMING: description: |- Mencegah priming TNT. Ini tidak mengesampingkan Pelindung batu dan baja. - name: cat dasar TNT - hint: Cat dasar TNT dinonaktifkan + name: Pemasangan sumbu TNT + hint: Pemasangan sumbu TNT dinonaktifkan TRADING: description: Beralih perdagangan name: Perdagangan penduduk desa @@ -1711,12 +1709,12 @@ protection: TREES_GROWING_OUTSIDE_RANGE: name: Pohon yang tumbuh di luar jangkauan description: |- - Beralih apakah pohon dapat tumbuh di luar an - & jangkauan perlindungan suatu pulau atau tidak. - Tidak hanya akan mencegah penempatan anakan - di luar jangkauan perlindungan pulau - & terus berkembang, namun hal ini juga akan menghambat generasi - dedaunan/batang kayu di luar pulau, demikian + Alihkan apakah pohon dapat tumbuh di luar + jangkauan perlindungan [prefix_island] atau tidak. + Tidak hanya akan mencegah anakan + di luar jangkauan perlindungan [prefix_island] + terus berkembang, tetapi juga akan menghambat pembuatan + dedaunan/batang kayu di luar [prefix_island], sehingga menebang pohon. TURTLE_EGGS: description: Alihkan penghancuran @@ -1727,9 +1725,9 @@ protection: name: Pejalan Beku hint: Frost Walker dinonaktifkan EXPERIENCE_PICKUP: - name: Pengalaman penjemputan + name: Pengambilan pengalaman description: Alihkan pengambilan bola pengalaman - hint: Penjemputan pengalaman dinonaktifkan + hint: Pengambilan pengalaman dinonaktifkan PREVENT_TELEPORT_WHEN_FALLING: name: Mencegah teleport ketika terjatuh description: |- @@ -1738,21 +1736,21 @@ protection: jika mereka jatuh. hint: 'Anda tidak dapat melakukan itu sambil jatuh.' VISITOR_KEEP_INVENTORY: - name: Pengunjung menyimpan inventaris kematian + name: Pengunjung menyimpan inventaris saat mati description: |- - Mencegah pemain kehilangan miliknya - &sebuah item dan pengalaman jika mereka mati - &sebuah pulau tempat mereka menjadi pengunjung. + Mencegah pemain kehilangan + item dan pengalaman jika mereka mati di + [prefix_an-island] tempat mereka menjadi pengunjung. - Anggota pulau masih kehilangan item mereka - jika mereka mati di pulau mereka sendiri! + Anggota [prefix_Island] masih kehilangan item mereka + jika mereka mati di [prefix_island] mereka sendiri! SPAWN_PROTECTION: - name: Spawn island void protection + name: Perlindungan void pulau spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Jika diaktifkan, pemain yang jatuh + ke dalam void di pulau spawn + akan diteleportasi kembali ke + titik spawn alih-alih mati. RAID_TRIGGER: name: Pemicu penggerebekan description: Menetapkan peringkat pulau minimum yang diperlukan untuk memicu penggerebekan @@ -1762,7 +1760,7 @@ protection: description: |- Beralih jika entitas (non-pemain) bisa gunakan portal untuk berteleportasi - &sebuah dimensi + antar dimensi WIND_CHARGE: name: Muatan angin description: |- @@ -1771,27 +1769,27 @@ protection: dapat menggunakan muatan angin di pulau ini. hint: Penggunaan muatan angin dinonaktifkan WITHER_DAMAGE: - name: Alihkan kerusakan layu + name: Alihkan kerusakan wither description: |- - Kalau aktif, layu bisa - & blok kerusakan dan pemain + Jika aktif, wither dapat + merusak blok dan pemain WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Izinkan Tempat Tidur & Respawn Jangkar untuk memecahkan blok dan merusak - &sebuah entitas di luar batas pulau. + entitas di luar batas [prefix_island]. name: Kerusakan ledakan blok dunia WORLD_TNT_DAMAGE: description: |- Izinkan kereta tambang TNT dan TNT untuk memecahkan blok dan merusak - &sebuah entitas di luar batas pulau. + entitas di luar batas [prefix_island]. name: Kerusakan TNT dunia locked: 'Pulau ini terkunci!' locked-island-bypass: '[prefix_Island] ini terkunci, tetapi kamu memiliki izin untuk melewatinya.' - protected: 'Pulau dilindungi: [deskripsi].' - world-protected: 'Dunia dilindungi: [deskripsi].' - spawn-protected: 'Bibit dilindungi: [deskripsi].' + protected: '[prefix_Island] dilindungi: [description].' + world-protected: 'Dunia dilindungi: [description].' + spawn-protected: 'Spawn dilindungi: [description].' panel: next: 'Halaman Berikutnya' previous: 'Halaman Sebelumnya' @@ -1805,12 +1803,12 @@ protection: expert: name: 'Pengaturan Pakar' description: 'Menampilkan semua pengaturan yang tersedia.' - click-to-switch: 'Klik untuk beralih ke [berikutnya].' + click-to-switch: 'Klik untuk beralih ke [next].' reset-to-default: name: 'Atur ulang ke default' description: | - Menyetel ulang SEMUA pengaturan ke pengaturannya - ilai bawaan. + Menyetel ulang SEMUA pengaturan ke + nilai bawaannya. confirm: konfirmasi instructions: >- Apakah Anda yakin? Ketik "konfirmasi" untuk mengatur ulang @@ -1826,15 +1824,15 @@ protection: Pengaturan umum untuk pulau ini WORLD_SETTING: - title: '[nama_dunia] Pengaturan' + title: '[world_name] Pengaturan' description: 'Pengaturan untuk dunia game ini' WORLD_DEFAULTS: - title: '[nama_dunia] Perlindungan Dunia' + title: '[world_name] Perlindungan Dunia' description: | - Pengaturan perlindungan kapan - &seorang pemain berada di luar pulau mereka + Pengaturan perlindungan saat + pemain berada di luar [prefix_island] mereka flag-item: - name-layout: '&sebuah nama]' + name-layout: '[name]' command-instructions: setname: |- Pilih pangkat yang dapat @@ -1907,7 +1905,7 @@ protection: Klik untuk beralih. - Pengaturan saat ini: [pengaturan] + Pengaturan saat ini: [setting] setting-active: 'Aktif' setting-disabled: 'Dinonaktifkan' management: @@ -1939,7 +1937,7 @@ management: name: 'Katalog Tambahan' description: 'Membuka Katalog Addons' credits: - name: 'SKS' + name: 'Kredit' description: 'Membuka Kredit untuk BentoBox' empty-here: name: 'Ini terlihat kosong di sini...' @@ -1951,27 +1949,27 @@ management: COMPATIBLE: | Menjalankan [name] [version]. - BentoBox sedang berjalan di a - KOMPATIBEL &perangkat lunak server dan - &sebuah versi. + BentoBox sedang berjalan pada + KOMPATIBEL perangkat lunak server dan + versi. Fitur-fiturnya dirancang sepenuhnya untuk - erlari di lingkungan ini. + berjalan di lingkungan ini. SUPPORTED: | Menjalankan [name] [version]. - BentoBox sedang berjalan di a - DIDUKUNG &perangkat lunak server dan - &sebuah versi. + BentoBox sedang berjalan pada + DIDUKUNG perangkat lunak server dan + versi. Sebagian besar fiturnya akan berjalan dengan lancar di lingkungan ini. NOT_SUPPORTED: | Menjalankan [name] [version]. - BentoBox sedang berjalan di a - TIDAK DIDUKUNG &perangkat lunak server atau - &sebuah versi. + BentoBox sedang berjalan pada + TIDAK DIDUKUNG perangkat lunak server atau + versi. Meskipun sebagian besar fiturnya akan berjalan dengan benar, bug khusus platform atau @@ -1979,9 +1977,9 @@ management: INCOMPATIBLE: | Menjalankan [name] [version]. - BentoBox saat ini berjalan di - TIDAK SESUAI &perangkat lunak server atau - &sebuah versi. + BentoBox saat ini berjalan pada + TIDAK KOMPATIBEL perangkat lunak server atau + versi. Perilaku aneh dan bug dapat terjadi dan sebagian besar fitur mungkin tidak stabil. @@ -1996,12 +1994,12 @@ catalog: name: 'Mode permainan' description: | Klik untuk menelusuri - & Gamemode resmi yang tersedia. + Gamemode resmi yang tersedia. addons: name: 'Tambahan' description: | Klik untuk menelusuri - & Addons resmi yang tersedia. + Addons resmi yang tersedia. icon: description-template: | [topic] @@ -2010,7 +2008,7 @@ catalog: [description] Klik untuk mendapatkan tautan ke - & rilis terbaru. + rilis terbaru. already-installed: Sudah terpasang! install-now: Instal sekarang! empty-here: @@ -2023,7 +2021,7 @@ catalog: enums: DamageCause: CONTACT: Kontak - ENTITY_ATTACK: Serangan Massa + ENTITY_ATTACK: Serangan Entitas ENTITY_SWEEP_ATTACK: Serangan Sapu PROJECTILE: Proyektil SUFFOCATION: Mati lemas @@ -2045,7 +2043,7 @@ enums: FALLING_BLOCK: Blok Jatuh THORNS: duri DRAGON_BREATH: Nafas Naga - CUSTOM: Kebiasaan + CUSTOM: Kustom FLY_INTO_WALL: Terbang Ke Dinding HOT_FLOOR: Lantai Panas CRAMMING: menjejalkan @@ -2056,9 +2054,9 @@ enums: WORLD_BORDER: Batas Dunia panel: credits: - title: '[nama] SKS' + title: '[name] Kredit' contributor: - name: '&sebuah nama]' + name: '[name]' description: | Melakukan: [commits] empty-here: @@ -2153,5 +2151,5 @@ successfully-loaded: | | _ \ | | | _ \ oleh tastybento dan Poslovitch | |_) | ___ _ __ | |_ ___ | |_) | _____ __ 2017 - 2023 | _ < / _ \ '_ \| __/ _ \| _ < / _ \ \/ / - | |_) | __/ | | | || (_) | |_) | (_) > < v[versi] + | |_) | __/ | | | || (_) | |_) | (_) > < v[version] |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Dimuat dalam [time]ms. From c14ba475173695a7dff02a364d808e91a721119b Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:22:47 -0700 Subject: [PATCH 26/95] Fix Traditional Chinese HK (zh-HK.yml) locale: translate English strings, fix wrong translations and broken tags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated maxsize section and SPAWN_PROTECTION flag - Translate reserved-island, Placeholder Browser, authors label - Fix "球員" (sports player) to "玩家" (game player) throughout team GUI - Fix "播放器" (media player) to "玩家" in blueprint times - Fix "伊斯蘭國" (ISIS) machine translation error in purge too-many - Fix "彎曲曲托" to "BentoBox" in perms description - Fix "要騙子玩家" to "設為協作者" for coop command - Fix wrong Minecraft item names: 磨石->砂輪, 打擊->切石機, 簽名編輯->告示牌編輯 - Translate Shulker/Enderman teleport, Crafter, Smithing, Loom, Grindstone flags - Fix SONIC_BOOM DamageCause "聲音繁榮" to "音波衝擊" - Fix broken MiniMessage tags: &但->gray tag, mismatched bold/color nesting - Fix "b不支持的" typo in NOT_SUPPORTED compatibility message - Fix command-instructions machine translations (雞舍, Demote, Unban, etc.) - Fix various hint fields missing red formatting tags Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/zh-HK.yml | 236 +++++++++++++-------------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/src/main/resources/locales/zh-HK.yml b/src/main/resources/locales/zh-HK.yml index 6d4fdfdce..b1378681d 100644 --- a/src/main/resources/locales/zh-HK.yml +++ b/src/main/resources/locales/zh-HK.yml @@ -61,7 +61,7 @@ commands: maxhomes: description: 更改此[prefix_island]或玩家的[prefix_island]的房屋數量 parameters: [[prefix_island] name] - max-homes-set: '[name] - Set [prefix_island] max homes to [number]' + max-homes-set: '[name] - 已將[prefix_island]最大Home數設為 [number]' errors: unknown-island: 未知[prefix_island]! [name] resethome: @@ -93,9 +93,9 @@ commands: days-one-or-more: '天數必須為最少1。' purgable-islands: '找到 [number]個 不活動可以被清理的島嶼。' too-many: |- - 這很多,可能需要很長時間才能刪除。 - 考慮使用區域性插件來刪除世界塊 - 並設置保留的陸地上的伊斯蘭國:bentobox的config.yml中。 + 數量很多,可能需要很長時間才能刪除。 + 考慮使用區域性插件來刪除世界區塊 + 並在 BentoBox 的 config.yml 中設置保留島嶼。 然後進行清除。 purge-in-progress: |- 清理正在進行中。 @@ -114,7 +114,7 @@ commands: regions: parameters: '[days]' description: 通過刪除舊區域文件清除島 - confirm: '類型 /[label] purge regions confirm 要開始清除' + confirm: '輸入 /[label] purge regions confirm 開始清除' protect: description: 開/關 島嶼清理保護, 開啟清理保護的島嶼不會被清理。 move-to-island: '請先回到島上再進行操作!' @@ -159,7 +159,7 @@ commands: not-in-team: '這玩家不在隊伍中。' admin-kicked: '管理員將您從隊伍中踢了出來。' success: '您已將 [name] [owner] 的島嶼裡踢出去。' - success-all: '球員從這個世界上的所有球隊中撤出' + success-all: '玩家已從此世界中的所有隊伍中移除' setowner: parameters: description: 將島嶼所有權轉移給指定玩家 @@ -167,12 +167,12 @@ commands: must-be-on-island: '您必須在[prefix_island]上設置所有者' confirmation: 您確定要設置[name]在[xyz]上成為[prefix_island]的所有者嗎? success: '已將[name]提升為島主。' - extra-islands: 警告:該玩家現在擁有[number]島。這是設置或perms所允許的要多:[max]。 + extra-islands: 警告:該玩家現在擁有 [number] 個島嶼。這超過了設置或權限所允許的數量:[max]。 maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: 設定玩家的[prefix_island]最大隊伍人數(使用 0 重置為世界預設值) + success: '已將 [name] 的[prefix_island]最大隊伍人數設為 [number]' + reset: '已將 [name] 的[prefix_island]最大隊伍人數重置為世界預設值([number])。' range: description: 島嶼範圍管理命令 invalid-value: @@ -209,7 +209,7 @@ commands: parameters: description: 將玩家註冊到您當前所在的無人島 registered-island: '已將玩家註冊到位於 [xyz] 的島嶼。' - reserved-island: 'Reserved island at [xyz] for [name].' + reserved-island: '已為 [name] 保留位於 [xyz] 的[prefix_island]。' already-owned: '該島嶼不是無人島!' no-island-here: '這個地方沒有島嶼。確認來創建一個。' in-deletion: '這個島嶼空間正在被刪除。 請稍後再試' @@ -304,7 +304,7 @@ commands: manual: '沒有安全傳送點!手動傳送至 [location] 附近並解決這個問題' tpuser: parameters: <[prefix_island]'s player> [player's island] - description: 傳送一個球員到另一個球員的[prefix_island] + description: 將一個玩家傳送到另一個玩家的[prefix_island] getrank: parameters: [island owner] description: 得到玩家在他們的島嶼上的階銜 @@ -455,9 +455,9 @@ commands: 左鍵點擊 - 增加(往後移) 右鍵點擊 - 減少(往前移) times: |- - 播放器的最大並髮用途 - 左鍵單擊以增加 - 右鍵單擊以減少 + 玩家最大使用次數 + 左鍵點擊增加 + 右鍵點擊減少 unlimited-times: 無限 maximum-times: 最大[number]次 cost: | @@ -528,12 +528,12 @@ commands: 成功將玩家 [name] 的死亡次數減少 [number] 次。 他現在的死亡次數為: [total] 次。" resetname: - description: 重置播放器[prefix_island]名稱 - success: 成功重置[name]的[prefix_island]名稱。 + description: 重置玩家的[prefix_island]名稱 + success: '成功重置 [name] 的[prefix_island]名稱。' bentobox: description: BentoBox 管理員命令 perms: - description: 以yaml格式顯示彎曲曲托和插件的有效perm + description: 以 YAML 格式顯示 BentoBox 和附加組件的有效權限 about: description: 顯示版權和協議信息 placeholders: @@ -708,28 +708,28 @@ commands: description: '點擊循環排名' invitation: 邀請 invite: - name: 邀請球員 + name: 邀請玩家 description: |- - 球員必須在 - 和你成為同一世界 - 顯示在列表中。 + 玩家必須在 + 和你相同的世界 + 才會顯示在列表中。 tips: LEFT: name: '左點擊' - invite: '邀請球員' + invite: '邀請玩家' RIGHT: name: '右鍵單擊' SHIFT_RIGHT: - name: '右鍵單擊' + name: 'Shift+右鍵點擊' reject: '拒絕' - kick: '踢球員' - leave: '離開團隊' + kick: '踢出玩家' + leave: '離開隊伍' SHIFT_LEFT: - name: '左右單擊' + name: 'Shift+左鍵點擊' accept: '接受' setowner: |- - 設置所有者 - 給這個球員 + 將此玩家 + 設為島主 info: description: 顯示關於您的隊伍的詳細信息 member-layout: @@ -794,7 +794,7 @@ commands: you-will-lose-your-island: '警告!如果您同意, 您將失去自己的島嶼!' gui: titles: - team-invite-panel: 邀請球員 + team-invite-panel: 邀請玩家 button: already-invited: '已經邀請了' search: '搜索玩家' @@ -808,14 +808,14 @@ commands: search: '輸入玩家的名字' back: '後退' invite: |- - 邀請球員 - 加入您的團隊 + 邀請玩家 + 加入您的隊伍 RIGHT: name: '右鍵單擊' - coop: '要騙子玩家' + coop: '設為協作者' SHIFT_LEFT: - name: '左右單擊' - trust: '信任球員' + name: 'Shift+左鍵點擊' + trust: '信任玩家' errors: cannot-invite-self: '您不能邀請您自己!' cooldown: '您必須在 [number] 秒後才能邀請這個人' @@ -964,9 +964,9 @@ protection: name: '使用信標' hint: '已被禁止使用信標' BELL_RINGING: - description: 切換交互 - name: 讓鈴響 - hint: 貝爾鈴聲被禁用 + description: 切換鐘交互 + name: 敲鐘 + hint: '已被禁止敲鐘' BED: description: 切換 床交互/使用權 name: '使用床' @@ -1012,17 +1012,17 @@ protection: name: '使用按鈕' hint: '已被禁止使用按鈕' CANDLES: - description: 切換蠟燭相互作用 + description: 切換蠟燭交互 name: 蠟燭 - hint: 蠟燭互動禁用 + hint: '已被禁止與蠟燭交互' CAKE: description: 允許/禁止 食用蛋糕 name: '食用蛋糕' hint: '已被禁止食用蛋糕' CARTOGRAPHY: - name: 製圖表 - description: 切換使用 - hint: 製圖表訪問禁用 + name: 製圖台 + description: 切換製圖台使用權 + hint: '已被禁止使用製圖台' CONTAINER: name: '使用容器' description: |- @@ -1044,48 +1044,48 @@ protection: description: 允許/禁止 使用桶 hint: '已被禁止使用桶' CRAFTER: - name: 手工藝者 - description: 切換使用 - hint: Crafter訪問禁用 + name: 合成器 + description: 切換合成器使用權 + hint: '已被禁止使用合成器' BLOCK_EXPLODE_DAMAGE: description: |- 允許床和重生錨 - 打破塊和損壞 + 破壞方塊和傷害 實體。 - name: 阻止爆炸傷害 + name: 方塊爆炸傷害 COMPOSTER: name: '使用堆肥桶' description: 允許/禁止 使用堆肥桶 hint: '已被禁止使用堆肥桶' LOOM: - name: 織機 - description: 切換使用 - hint: 織機訪問禁用 + name: 織布機 + description: 切換織布機使用權 + hint: '已被禁止使用織布機' FLOWER_POT: name: '使用花盆' description: 允許/禁止 使用花盆 hint: '已被禁止使用花盆' GRINDSTONE: - name: 磨石 - description: 切換使用 - hint: 磨石訪問禁用 + name: 砂輪 + description: 切換砂輪使用權 + hint: '已被禁止使用砂輪' SHULKER_BOX: name: '使用界伏盒' description: 允許/禁止 使用界伏盒 hint: '已被禁止使用界伏盒' SHULKER_TELEPORT: description: |- - Shulker可以傳送 - 如果活動。 - name: Shulker teleport + 啟用後,界伏蚌 + 可以傳送。 + name: 界伏蚌傳送 SMITHING: - name: 鍛造 - description: 切換使用 - hint: 鍛造訪問禁用 + name: 鍛造台 + description: 切換鍛造台使用權 + hint: '已被禁止使用鍛造台' STONECUTTING: - name: 打擊 - description: 切換使用 - hint: 打擊訪問禁用 + name: 切石機 + description: 切換切石機使用權 + hint: '已被禁止使用切石機' TRAPPED_CHEST: name: '使用陷阱箱' description: 允許/禁止 使用陷阱箱 @@ -1160,9 +1160,9 @@ protection: name: '苦力怕訪客保護' hint: '已禁止訪客引燃的苦力怕爆炸' CROP_PLANTING: - description: '設定誰可以種子。' + description: '設定誰可以種植作物。' name: 作物種植 - hint: 作物種植障礙 + hint: '已被禁止種植作物' CROP_TRAMPLE: description: 允許/禁止 踩壞農作物 name: '踐踏農作物' @@ -1201,9 +1201,9 @@ protection: name: '終界使者破壞' ENDERMAN_TELEPORT: description: |- - Endermen可以傳送 - 如果活動。 - name: Enderman Teleport + 啟用後,終界使者 + 可以傳送。 + name: 終界使者傳送 ENDER_PEARL: description: |- 允許/禁止 使用終界珍珠 @@ -1265,18 +1265,18 @@ protection: HARVEST: description: |- 設定誰可以收穫農作物。 - 不要忘記允許物品 - 也接! + 別忘了也允許 + 拾取物品! name: 收穫作物 - hint: 收穫作物殘疾 + hint: '已被禁止收穫作物' HIVE: description: 允許/禁止 收集蜂蜜 name: '收集蜂蜜' hint: '已被禁止收集蜂蜜' HURT_TAMED_ANIMALS: - description: 切換傷害。啟用意味著馴服的動物會受到傷害。殘疾意味著它們是無敵的。 + description: 切換傷害。啟用時馴服的動物會受到傷害。禁用時它們將無敵。 name: 傷害馴服的動物 - hint: 馴服的動物受傷的殘疾 + hint: '已被禁止傷害馴服的動物' HURT_ANIMALS: description: 允許/禁止 傷害動物 name: '傷害動物' @@ -1325,7 +1325,7 @@ protection: LEASH: description: 允許/禁止 使用栓繩 name: '使用栓繩' - hint: 皮帶使用禁用 + hint: '已被禁止使用栓繩' LECTERN: name: '講台上的書' description: |- @@ -1363,7 +1363,7 @@ protection: description: |- 允許/禁止 放置、摧毀和 進入礦車" - hint: Minecart互動禁用 + hint: '已被禁止與礦車交互' MONSTER_NATURAL_SPAWN: description: 允許/禁止 怪物自然生成 name: '怪物自然生成' @@ -1448,7 +1448,7 @@ protection: 切換使用金蒲公英 暫停或恢復幼年 生物的成長 - hint: 暫停生物成長已禁用 + hint: '暫停生物成長已禁用' PRESSURE_PLATE: description: 允許/禁止 激活壓力板 name: '使用壓力板' @@ -1515,9 +1515,9 @@ protection: name: '使用伏聆嘯口' hint: '已被禁止使用伏聆嘯口' SIGN_EDITING: - description: '允許文本編輯標誌' - name: 簽名編輯 - hint: 簽名編輯被禁用 + description: '允許編輯告示牌文字' + name: 告示牌編輯 + hint: '已被禁止編輯告示牌' TNT_DAMAGE: description: 允許/禁止 TNT和TNT礦車破壞方塊和實體 name: 'TNT傷害' @@ -1562,18 +1562,18 @@ protection: 允許即為阻止傳送 hint: '已禁止在下墜時進行傳送' VISITOR_KEEP_INVENTORY: - name: 游客對死亡進行盤點 + name: 訪客死亡保留物品 description: |- - 防止玩家失去他們的物品和 - 經驗,只適用於他們死在了 - 他們是游客的島嶼。 + 防止玩家在作為訪客的島嶼 + 上死亡時失去物品和經驗。 + 僅適用於訪客身份。 SPAWN_PROTECTION: - name: Spawn island void protection + name: 出生島虛空保護 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 啟用後,在出生島 + 掉入虛空的玩家 + 會被傳送回出生點 + 而不是死亡。 RAID_TRIGGER: name: 觸發突襲 description: 設置觸發突襲所需的島嶼最低等級 @@ -1589,7 +1589,7 @@ protection: 切換風彈的使用。 如果禁用,訪客將無法 在該島嶼上使用風彈。 - hint: 風彈使用已禁用 + hint: '已被禁止使用風彈' WITHER_DAMAGE: name: '凋零傷害' description: |- @@ -1598,8 +1598,8 @@ protection: WORLD_BLOCK_EXPLODE_DAMAGE: description: |- 允許床和重生錨 - 打破塊和損壞 - 島嶼限制之外的實體。 + 破壞方塊和傷害 + 島嶼範圍外的實體。 name: 世界方塊爆炸傷害 WORLD_TNT_DAMAGE: description: |- @@ -1637,31 +1637,31 @@ protection: title: '設置' description: '適用於該島嶼的一般設置項' WORLD_SETTING: - title: '用於 [world_name] 的一般設置' + title: '用於 [world_name] 的一般設置' description: '這些設置項適用於全部游戲世界' WORLD_DEFAULTS: - title: '用於 [world_name] 的保護設定' + title: '用於 [world_name] 的保護設定' description: '島嶼範圍外適用的保護設定' flag-item: name-layout: '[name]' command-instructions: - setname: '選擇可以設置名稱' - ban: '選擇可以禁令球員' - unban: '選擇可以 Unban球員' + setname: '選擇誰可以設置名稱' + ban: '選擇誰可以封禁玩家' + unban: '選擇誰可以解封玩家' expel: '選擇誰可以驅逐訪客' - team-invite: '選擇可以邀請' - team-kick: '選擇可以踢' - team-coop: '選擇可以雞舍' - team-trust: '選擇可以相信' - team-uncoop: '選擇可以uncoop' - team-untrust: '選擇可以不信任' - team-promote: '選擇可以促進球員的等級' - team-demote: '選擇可以Demote球員的排名' - sethome: '選擇可以設置房屋' - deletehome: '選擇可以刪除房屋' - renamehome: '選擇可以重命名房屋' - setcount: '選擇可以更改階段' - border: '選擇可以使用邊境命令' + team-invite: '選擇誰可以邀請' + team-kick: '選擇誰可以踢出' + team-coop: '選擇誰可以設為協作者' + team-trust: '選擇誰可以設為信任者' + team-uncoop: '選擇誰可以取消協作' + team-untrust: '選擇誰可以取消信任' + team-promote: '選擇誰可以升階玩家' + team-demote: '選擇誰可以降階玩家' + sethome: '選擇誰可以設置Home點' + deletehome: '選擇誰可以刪除Home點' + renamehome: '選擇誰可以重命名Home點' + setcount: '選擇誰可以更改等級' + border: '選擇誰可以使用邊界命令' description-layout: |- [description] @@ -1744,15 +1744,15 @@ management: 正在運行 [name] [version] BentoBox當前正運行在 - b不支持的的服務器軟件和版本上。 + 不支持的的服務器軟件和版本上。 雖然它的部分功能可以正常運行, - &但可能發生平台相關的錯誤。 + 但可能發生平台相關的錯誤。 INCOMPATIBLE: | 正在運行 [name] [version] BentoBox當前正運行在 - 不兼容 的服務器軟件和版本上。 + 不兼容的服務器軟件和版本上。 它並不是為此運行環境設計的,可能 會發生奇怪的行為和錯誤,並且大部 @@ -1785,7 +1785,7 @@ catalog: description: | BentoBox 無法連接到 GitHub。 - 請修改配置允許BentoBox連接 + 請修改配置允許BentoBox連接 到互聯網, 或稍後再試。 enums: DamageCause: @@ -1818,8 +1818,8 @@ enums: CRAMMING: 擁擠 DRYOUT: 乾燥(魚類暴露在空氣中) FREEZE: 凍結 - KILL: 殺 - SONIC_BOOM: 聲音繁榮 + KILL: /kill 命令 + SONIC_BOOM: 音波衝擊 WORLD_BORDER: 世界邊界 panel: credits: @@ -1832,7 +1832,7 @@ panel: description: |- BentoBox 無法收集此組件的貢獻者。 - 請修改配置允許BentoBox連接 + 請修改配置允許BentoBox連接 到互聯網, 或稍後再試。 panels: island_homes: @@ -1857,11 +1857,11 @@ panels: description: |- [authors] |[selected] - authors: 'Authors: ' + authors: '作者: ' author: '- [name]' selected: '當前選擇。' placeholder: - title: 'Placeholder Browser' + title: '佔位符瀏覽器' buttons: bentobox: name: 'BentoBox' From 6f212058bbe7da7f9d244913f21bbe8eb93baeca Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:22:50 -0700 Subject: [PATCH 27/95] Fix Dutch (nl.yml) locale: correct mistranslations, placeholders, and untranslated strings - Translate untranslated English sections (maxsize, SPAWN_PROTECTION) - Fix translated placeholders back to English ([omschrijving]->[description], [bericht]->[message], [locatie]->[location], [onderwerp]->[topic], [installeren]->[install], [volgende]->[next], [wereld]->[world], [beschrijving]->[description], [prefix_eiland]->[prefix_island]) - Fix broken [name] placeholders (missing opening bracket in name-layout, credits) - Fix broken legacy color codes: & b -> proper MiniMessage tags - Fix "Nederland" (The Netherlands) -> "de Nether" in 4 places - Fix VOID "Ongeldig" (Invalid) -> "De Leegte" (The Void) - Fix wrong translations: "kippenhok" (chicken coop) -> "coop-lid", "Borstschade" (breast damage) -> "Kistschade" (chest damage), "Koor fruit" -> "Chorusfruit", "Kladblok" (notepad) -> "Nootblok", "Paaien eieren" (fish spawning) -> "Spawn-eieren", "Troosten" (to comfort) -> "Console", "klimplant" (vine) -> "creeper", "schoft" (scoundrel) -> "wither", "Betrijp" -> "Verwond", "Blokkeer explosie" -> "Blokexplosie", "Verbindingen" -> "Bijdragen" - Fix typos: "Teamaanmanagement" -> "Teambeheer", "verwijen" -> correct text - Fix misleading translations: unban messages, banlist, rank name - Remove errant ": c" from none-invited-you message - Fix untranslated English words: "Found", "Island at", "Island is", "Player" Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/nl.yml | 179 +++++++++++++++--------------- 1 file changed, 89 insertions(+), 90 deletions(-) diff --git a/src/main/resources/locales/nl.yml b/src/main/resources/locales/nl.yml index e37ed4ed8..555db92a2 100644 --- a/src/main/resources/locales/nl.yml +++ b/src/main/resources/locales/nl.yml @@ -57,7 +57,7 @@ commands: page: 'Pagina [page] van [total]' parameters: '[command]' description: help commando - console: Troosten + console: Console admin: help: description: admin commando @@ -65,13 +65,13 @@ commands: description: >- wijzig het aantal toegestane huizen op deze [prefix_island] of het huis van de speler [prefix_island] - parameters: [[prefix_eiland] naam] + parameters: [[prefix_island] naam] max-homes-set: '[name] - Zet [prefix_island] maximaal aantal huizen op [number]' errors: unknown-island: Onbekend [prefix_island]! [name] resethome: description: Reset het thuis van de speler naar standaard - parameters: [[prefix_eiland] naam] + parameters: [[prefix_island] naam] cleared: 'Thuis reset. [name]' resets: description: bewerk resets van de spelers @@ -88,8 +88,8 @@ commands: description: telt op bij het aantal keren dat deze speler zijn eiland reset parameters: success: >- - Met succes toegevoegd [number] wordt gereset naar & b [name], - waardoor het totaal wordt verhoogd naar [total] wordt gereset. + Met succes [number] resets toegevoegd aan [name], + waardoor het totaal wordt verhoogd naar [total] resets. remove: description: verwijdert uit hoe vaak deze speler zijn eiland reset parameters: @@ -141,12 +141,11 @@ commands: stopping: De zuivering stoppen unowned: description: zuiveren van eilanden die geen eigendom zijn - unowned-islands: 'Found [number]eilanden zonder eigendom.' + unowned-islands: 'Gevonden [number] eilanden zonder eigendom.' status: description: geeft de status van de zuivering weer status: >- - [purged] eilanden gezuiverd uit [purgeable] (& b - [percentage]% ) . + [purged] eilanden gezuiverd uit [purgeable] ([percentage]%) . team: description: team beheren add: @@ -195,10 +194,10 @@ commands: Waarschuwing: deze speler bezit nu [number] eilanden. Dit is meer dan toegestaan volgens de instellingen of permissies: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: stel de maximale teamgrootte in voor het [prefix_island] van een speler (gebruik 0 om naar de standaard te resetten) + success: 'De maximale teamgrootte van [name]''s [prefix_island] ingesteld op [number].' + reset: 'De maximale teamgrootte van [name]''s [prefix_island] gereset naar de standaard ([number]).' range: description: admin eilandbereik commando invalid-value: @@ -246,7 +245,7 @@ commands: description: registreer speler op het eiland waar je je bevindt registered-island: 'geregistreerde [name] op het eiland op [xyz].' reserved-island: 'gereserveerd eiland op [xyz] voor [name].' - already-owned: 'Island is al eigendom van een andere speler!' + already-owned: 'Eiland is al eigendom van een andere speler!' no-island-here: 'Er is hier geen eiland. Bevestig om er een te maken.' in-deletion: 'Deze eilandruimte wordt momenteel verwijderd. Probeer later.' cannot-make-island: >- @@ -286,7 +285,7 @@ commands: island-protection-center: 'Beschermingsgebied centrum: [xyz]' island-center: 'Eilandcentrum: [xyz]' island-coords: 'Eilandcoördinaten: [xz1] tot [xz2]' - islands-in-trash: 'Player heeft eilanden in de prullenbak.' + islands-in-trash: 'Speler heeft eilanden in de prullenbak.' protection-range: 'Beschermingsbereik: [range]' protection-range-bonus-title: 'Inclusief deze bonussen:' protection-range-bonus: 'Bonus: [number]' @@ -354,7 +353,7 @@ commands: parameters: [speler om te teleporteren] description: teleporteer naar het eiland van een speler manual: >- - Geen veilige warp gevonden! Handmatig tp in de buurt van [locatie] + Geen veilige warp gevonden! Handmatig tp in de buurt van [location] en bekijk het tpuser: parameters: <[prefix_island]'s player> [player's island] @@ -420,7 +419,7 @@ commands: file-exists: 'Bestand bestaat al, overschrijven?' no-such-file: 'Zo''n bestand bestaat niet!' could-not-load: 'Kon dat bestand niet laden!' - could-not-save: 'Hmm, er is iets misgegaan bij het opslaan van dat bestand: [bericht]' + could-not-save: 'Hmm, er is iets misgegaan bij het opslaan van dat bestand: [message]' set-pos1: 'positie 1 ingesteld op [vector]' set-pos2: 'positie 2 ingesteld op [vector]' set-different-pos: 'Stel een andere locatie in - deze positie is al ingesteld!' @@ -571,7 +570,7 @@ commands: cannot-delete-owner: >- Alle eilandleden moeten van het eiland worden verwijderd voordat ze het kunnen verwijderen. - deleted-island: 'Island at [xyz] is succesvol verwijderd.' + deleted-island: 'Eiland op [xyz] is succesvol verwijderd.' deletehomes: parameters: description: verwijdert alle benoemde huizen van [prefix_an-island] @@ -722,7 +721,7 @@ commands: estimated-time: 'Geschatte tijd: [number]seconden.' blocks: 'Building it blok voor blok: [number] blokken in totaal ...' entities: 'Het vullen met entiteiten: [number]entiteiten in totaal ...' - dimension-done: '[prefix_Island] in [wereld] is gebouwd.' + dimension-done: '[prefix_Island] in [world] is gebouwd.' done: 'Klaar! Je eiland staat klaar en wacht op je!' pick: 'Kies een eiland' cannot-afford: 'Je kunt dit niet betalen! Kosten: [cost]' @@ -774,7 +773,7 @@ commands: home-list-syntax: '[name]' click-to-teleport: 'Klik om te teleporteren!' nether: - not-allowed: 'Het is niet toegestaan om uw huis in Nederland te plaatsen.' + not-allowed: 'Het is niet toegestaan om uw huis in de Nether te plaatsen.' confirmation: 'Weet u zeker dat u uw huis in de Nether wilt plaatsen?' the-end: not-allowed: 'Je mag je huis niet op het einde zetten.' @@ -799,7 +798,7 @@ commands: description: beheer je team gui: titles: - team-panel: Teamaanmanagement + team-panel: Teambeheer buttons: status: name: Status @@ -869,7 +868,7 @@ commands: all-members-logged-off: >- Alle leden van het eiland hebben zich afgemeld, zodat u niet langer een coöperatief lid bent van het eiland van [name]. - success: '[name] is niet langer lid van de kippenhok van uw eiland.' + success: '[name] is niet langer coop-lid van uw eiland.' is-full: 'Je kunt niemand anders opsluiten.' trust: description: geef een speler een vertrouwde rang op je eiland @@ -878,7 +877,7 @@ commands: name-has-invited-you: >- [name] heeft je uitgenodigd om lid te worden van een vertrouwd lid van hun eiland. - player-already-trusted: 'Player is al vertrouwd!' + player-already-trusted: 'Speler is al vertrouwd!' you-are-trusted: 'U wordt vertrouwd door [name] !' success: 'U vertrouwde [name] .' is-full: 'Je kunt niemand anders vertrouwen.' @@ -916,7 +915,7 @@ commands: back: 'Terug' invite: |- om een speler uit te nodigen - om je team te verwijen + om lid te worden van je team RIGHT: name: 'Rechts Klikken' coop: 'om speler te coöpereren' @@ -929,7 +928,7 @@ commands: Je kunt die persoon niet voor nog een [number]seconden uitnodigen. island-is-full: 'Je eiland is vol, je kunt niemand anders uitnodigen.' - none-invited-you: 'Niemand heeft je uitgenodigd: c.' + none-invited-you: 'Niemand heeft je uitgenodigd.' you-already-are-in-team: 'Je zit al in een team!' already-on-team: 'Die speler zit al in een team!' invalid-invite: 'Die uitnodiging is niet langer geldig, sorry.' @@ -1015,11 +1014,11 @@ commands: parameters: cannot-unban-yourself: 'Je kunt jezelf niet ongedaan maken!' player-not-banned: 'Speler is niet verbannen.' - player-unbanned: '[name] is nu uitgesloten van uw eiland.' - you-are-unbanned: '[name] verbannen u van hun eiland!' + player-unbanned: '[name] is nu niet meer verbannen van uw eiland.' + you-are-unbanned: '[name] heeft uw verbanning van hun eiland opgeheven!' banlist: description: lijst verbannen spelers - noone: 'Niemand is verboden op dit eiland.' + noone: 'Niemand is verbannen van dit eiland.' the-following: 'De volgende spelers zijn uitgesloten:' names: '[line]' you-can-ban: 'Je kunt tot [number]meer spelers bannen.' @@ -1051,7 +1050,7 @@ ranks: trusted: Vertrouwd coop: Coop visitor: Bezoeker - banned: Verboden + banned: Verbannen admin: Beheerder mod: Mod protection: @@ -1073,7 +1072,7 @@ protection: hint: Gebruik van aambeeld uitgeschakeld ARMOR_STAND: description: Wissel interactie - name: Armor staat + name: Wapenstandaards hint: Gebruik van pantserstandaard uitgeschakeld AXOLOTL_SCOOPING: name: Axolotl Scheppen @@ -1169,9 +1168,9 @@ protection: description: Schakel vateninteractie in/uit hint: Toegang tot vat uitgeschakeld CRAFTER: - name: Knutsel - description: Gebruik - hint: Knutsel uitgeschakeld + name: Crafter + description: Schakel gebruik in/uit + hint: Crafter uitgeschakeld BLOCK_EXPLODE_DAMAGE: description: |- Sta Bed & Respawn Ankers toe @@ -1232,12 +1231,12 @@ protection: description: Schakel tussen trechterinteractie hint: Vultrechterinteractie uitgeschakeld CHEST_DAMAGE: - description: Schakel borstschade door explosies om - name: Borstschade + description: Schakel kistschade door explosies om + name: Kistschade CHORUS_FRUIT: description: Schakel teleportatie in - name: Koor fruit - hint: Koorfruit teleporteren uitgeschakeld + name: Chorusfruit + hint: Chorusfruit teleporteren uitgeschakeld CLEAN_SUPER_FLAT: description: |- Schakel in om alles op te schonen @@ -1278,16 +1277,16 @@ protection: hint: Toegang tot werkbank uitgeschakeld CREEPER_DAMAGE: description: | - Toggle klimplant - bescherming tegen schade - name: Bescherming tegen schade door kruipers + Schakel creeper- + schadebescherming in/uit + name: Creeper-schadebescherming CREEPER_GRIEFING: description: | - Toggle klimplant verdriet - bescherming bij ontsteking + Schakel creeper-griefing- + bescherming in/uit bij ontsteking door eilandbezoeker. - name: Creeper rouwende bescherming - hint: Creeper verdriet uitgeschakeld + name: Creeper-griefingbescherming + hint: Creeper-griefing uitgeschakeld CROP_PLANTING: description: 'Stel in wie zaden kan planten.' name: Gewasplanting @@ -1301,7 +1300,7 @@ protection: name: Gebruik deuren hint: Deurinteractie uitgeschakeld DRAGON_EGG: - name: Draken Ei + name: Drakenei description: |- Voorkomt interactie met drakeneieren. @@ -1326,15 +1325,15 @@ protection: hint: Ender-kisten zijn uitgeschakeld in deze wereld ENDERMAN_DEATH_DROP: description: |- - Enderman zal vallen - willekeurig blok dat ze zijn - bedrijf als het wordt gedood. - name: Enderman Dooddruppel + Enderman laat het blok vallen + dat ze vasthouden + als ze worden gedood. + name: Enderman doodsdrop ENDERMAN_GRIEFING: description: |- Enderman kan verwijderen blokken van eilanden - name: Enderman verdrietig + name: Enderman-griefing ENDERMAN_TELEPORT: description: |- Eindermanen kunnen teleporteren @@ -1355,9 +1354,9 @@ protection: EXPERIENCE_BOTTLE_THROWING: name: Ervaar het gooien van flessen description: Wissel met het werpen van ervaringsflessen. - hint: Ervaar flessen met een handicap + hint: Ervaringsflessen gooien uitgeschakeld FIRE_BURNING: - name: Brandend vuur + name: Vuurverbranding description: |- Omschakelen of vuur kan branden blokken of niet. @@ -1415,7 +1414,7 @@ protection: description: >- Schakel schade aan. Ingeschakeld betekent dat tamme dieren schade kunnen oplopen. Uitgeschakeld betekent dat ze onoverwinnelijk zijn. - name: Betrijp tamme dieren + name: Verwond tamme dieren hint: Getemde dieren schade uitschakelen HURT_ANIMALS: description: Schakel pijn uit @@ -1428,9 +1427,9 @@ protection: HURT_VILLAGERS: description: Schakel pijn uit name: Dorpsbewoners pijn doen - hint: Dorpeling met een handicap + hint: Dorpelingen verwonden uitgeschakeld ITEM_FRAME: - name: Voorwerp kader + name: Itemframes description: |- Toggle-interactie. Overrides plaatsen of breken blokken @@ -1439,7 +1438,7 @@ protection: description: |- Mobs kunnen schade toebrengen itemframes - name: Schade aan het frame van het item + name: Itemframe-schade INVINCIBLE_VISITORS: description: |- onoverwinnelijke bezoeker configureren @@ -1457,8 +1456,8 @@ protection: hint: Het verwijderen van items is uitgeschakeld ITEM_PICKUP: description: Schakel ophalen - name: Afhalen van artikelen - hint: Ophalen van artikel is uitgeschakeld + name: Items oppakken + hint: Items oppakken is uitgeschakeld JUKEBOX: description: Schakel tussen gebruik name: Jukebox-gebruik @@ -1532,14 +1531,14 @@ protection: description: |- Toggle-toegang om inventaris op te zetten - name: Monteer inventaris - hint: Het opbouwen van voorraden is uitgeschakeld + name: Rij-inventaris + hint: Toegang tot rij-inventaris is uitgeschakeld NAME_TAG: name: Naamplaatjes description: Toggle gebruik hint: Interactie met naamlabel uitgeschakeld NATURAL_SPAWNING_OUTSIDE_RANGE: - name: Natuurlijk wezen paait buiten bereik + name: Natuurlijke spawning buiten bereik description: |- Omschakelen of wezens (dieren en monsters) kunnen van nature buiten spawnen @@ -1550,8 +1549,8 @@ protection: ei. NOTE_BLOCK: description: Toggle gebruik - name: Kladblok - hint: Noteblock-interactie uitgeschakeld + name: Nootblok + hint: Nootblok-interactie uitgeschakeld OBSIDIAN_SCOOPING: name: Obsidiaan scheppen description: |- @@ -1647,9 +1646,9 @@ protection: PVP in- / uitschakelen in de Nether. name: Nether PVP - hint: PVP uitgeschakeld in Nederland - enabled: 'De PVP in Nederland is ingeschakeld.' - disabled: 'De PVP in Nederland is uitgeschakeld.' + hint: PVP uitgeschakeld in de Nether + enabled: 'De PVP in de Nether is ingeschakeld.' + disabled: 'De PVP in de Nether is uitgeschakeld.' PVP_OVERWORLD: description: |- PVP in- / uitschakelen @@ -1660,7 +1659,7 @@ protection: disabled: 'De PVP in the Overworld is uitgeschakeld.' REDSTONE: description: Toggle gebruik - name: Redstone-artikelen + name: Redstone-items hint: Redstone-interactie uitgeschakeld REMOVE_END_EXIT_ISLAND: description: |- @@ -1683,13 +1682,13 @@ protection: hint: Scheren is uitgeschakeld SPAWN_EGGS: description: Toggle gebruik - name: Paaien eieren - hint: Broedeieren uitgeschakeld + name: Spawn-eieren + hint: Spawn-eieren uitgeschakeld SPAWNER_SPAWN_EGGS: description: |- Maakt het mogelijk om het entiteitstype van een spawner te wijzigen het gebruik van spawn-eieren. - name: Paaien eieren op spawners + name: Spawn-eieren op spawners hint: >- het wijzigen van het entiteitstype van een spawner met spawn-eieren is niet toegestaan @@ -1769,12 +1768,12 @@ protection: [prefix_Island] leden verliezen nog steeds hun items als ze sterven op hun eigen [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Spawn-eiland leegtebescherming description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Wanneer ingeschakeld, worden spelers die + in de leegte vallen bij het spawn-eiland + teruggeteleporteerd naar het spawnpunt + in plaats van te sterven. RAID_TRIGGER: name: Aanval activeren description: Stelt de minimale eilandrang in die nodig is om een aanval te activeren @@ -1793,10 +1792,10 @@ protection: geen windladingen gebruiken op dit eiland. hint: Gebruik van windladingen uitgeschakeld WITHER_DAMAGE: - name: Schakel schoftschade in + name: Wither-schade description: |- - Indien actief, kan de schoft - schadeblokken en spelers + Indien actief, kan de wither + blokken en spelers beschadigen WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Sta Bed & Respawn Ankers toe @@ -1811,9 +1810,9 @@ protection: name: Wereld TNT-schade locked: 'Dit eiland is op slot!' locked-island-bypass: 'Dit [prefix_island] is op slot, maar je hebt toestemming om dit te negeren.' - protected: 'Eiland beschermd: [omschrijving].' - world-protected: 'Wereld beschermd: [omschrijving].' - spawn-protected: 'Spawn beschermd: [omschrijving].' + protected: 'Eiland beschermd: [description].' + world-protected: 'Wereld beschermd: [description].' + spawn-protected: 'Spawn beschermd: [description].' panel: next: 'Volgende pagina' previous: 'Vorige pagina' @@ -1827,7 +1826,7 @@ protection: expert: name: 'Expertinstellingen' description: 'Geeft alle beschikbare instellingen weer.' - click-to-switch: 'Klik op om over te schakelen naar de [volgende] .' + click-to-switch: 'Klik op om over te schakelen naar de [next] .' reset-to-default: name: 'Reset naar standaard' description: | @@ -1854,7 +1853,7 @@ protection: Beveiligingsinstellingen wanneer speler is buiten zijn eiland flag-item: - name-layout: 'naam]' + name-layout: '[name]' command-instructions: setname: |- Selecteer de rang die de @@ -2024,8 +2023,8 @@ catalog: beschikbare officiële add-ons. icon: description-template: | - [onderwerp] - [installeren] + [topic] + [install] [description] @@ -2053,9 +2052,9 @@ enums: MELTING: Smeltend LAVA: Lava DROWNING: Verdrinking - BLOCK_EXPLOSION: Blokkeer explosie + BLOCK_EXPLOSION: Blokexplosie ENTITY_EXPLOSION: Entiteitsexplosie - VOID: Ongeldig + VOID: De Leegte LIGHTNING: Bliksem SUICIDE: Zelfmoord STARVATION: Verhongering @@ -2065,7 +2064,7 @@ enums: FALLING_BLOCK: Vallend blok THORNS: Doornen DRAGON_BREATH: Draken adem - CUSTOM: Op maat + CUSTOM: Aangepast FLY_INTO_WALL: Vlieg in de muur HOT_FLOOR: Hete vloer CRAMMING: Proppen @@ -2078,8 +2077,8 @@ panel: credits: title: '[name] credits' contributor: - name: 'naam]' - description: 'Verbindingen: [commits]' + name: '[name]' + description: 'Bijdragen: [commits]' empty-here: name: 'Dit ziet er hier leeg uit ...' description: | @@ -2098,7 +2097,7 @@ panels: buttons: bundle: name: '[name]' - description: '[beschrijving]' + description: '[description]' uses: 'Gebruikt [number]/[max]' unlimited: 'Onbeperkt aantal gebruiken toegestaan' cost: 'Kosten: [cost]' From 1451d833858901088a5ba39dec45a99c5b819ba5 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 20:50:57 -0700 Subject: [PATCH 28/95] Fix German (de.yml) locale: correct mistranslations, typos, broken tags, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes untranslated English in maxsize and SPAWN_PROTECTION sections, nonsensical words (Firch, Unglaner, blauprint), broken legacy color codes, du/Sie inconsistency, duplicated PETS_STAY_AT_HOME text in VISITOR_KEEP_INVENTORY, wrong translations (Lösung/Spülen/Blockieren Sie), and rewrites all garbled command-instruction entries. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/de.yml | 162 +++++++++++++++--------------- 1 file changed, 79 insertions(+), 83 deletions(-) diff --git a/src/main/resources/locales/de.yml b/src/main/resources/locales/de.yml index 9b3ae17c8..a859aee8f 100644 --- a/src/main/resources/locales/de.yml +++ b/src/main/resources/locales/de.yml @@ -74,7 +74,7 @@ commands: unknown-island: Unbekannt [prefix_island]! [name] resethome: description: Setzen Sie das Haus des Spielers auf Standard zurück - parameters: [[prefix_island] Name] + parameters: [[prefix_island] Name] cleared: 'Hausrücksetzen. [name]' resets: description: Resets der Spieler bearbeiten @@ -120,18 +120,18 @@ commands: Scanning -Inseln in der Datenbank. Dies kann eine Weile dauern, je nachdem, wie viele Sie haben ... scanning-in-progress: 'In Arbeit scannen, bitte warten Sie' - none-found: 'Keine Inseln, um zu reinigen.' - total-islands: 'Sie haben [number] Islands in Ihrer Datenbank in allen Welten.' + none-found: 'Keine zu löschenden Inseln gefunden.' + total-islands: 'Du hast [number] Inseln in deiner Datenbank über alle Welten.' number-error: 'Eingabe muss eine Anzahl von Tagen sein' confirm: 'Tippe /[label] purge confirm zum Starten des Löschvorgangs ein' - completed: 'Lösung gestoppt' + completed: 'Löschung gestoppt' see-console-for-status: Löschung gestartet. Für den Status siehe Konsole no-purge-in-progress: 'Derzeit wird keine Löschung durchgeführt.' regions: parameters: '[days]' description: Säuberinseln durch Löschen alter Regionendateien confirm: >- - Typ /[label] purge regions confirm , um mit dem Spülen zu + Tippe /[label] purge regions confirm , um mit dem Löschen zu beginnen protect: description: Umschalten des Insellöschschutzes @@ -198,10 +198,10 @@ commands: mehr als durch die Einstellungen oder Berechtigungen erlaubt ist: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Maximale Teamgröße für die [prefix_island] eines Spielers festlegen (0 für Weltstandardwert) + success: 'Maximale Teamgröße von [name]s [prefix_island] auf [number] gesetzt.' + reset: 'Maximale Teamgröße von [name]s [prefix_island] auf den Weltstandardwert zurückgesetzt ([number]).' range: description: Admin Insel Bereichsbefehl invalid-value: @@ -221,7 +221,7 @@ commands: Graue Partikelzeigen die maximale Inselgrenze an. - Grüne Partikelzeigen den voreingestellten Schutzbereich an, wenn + Grüne Partikel zeigen den voreingestellten Schutzbereich an, wenn der Inselschutzbereich davon abweicht. showing: 'Inselbegrenzungen eingeblendet' set: @@ -231,7 +231,7 @@ commands: reset: parameters: description: Setzt den inselgeschützten Bereich auf den Weltstandard zurück - success: '& a Setzt den Inselschutzbereich auf & b [number] & a zurück.' + success: 'Inselschutzbereich auf [number] zurückgesetzt.' add: description: Erhöht den Schutzbereich der Insel parameters: [Inselstandort] @@ -264,7 +264,7 @@ commands: unregistered-island: 'Unregistrierter Spieler von der Insel bei [xyz].' errors: unknown-island-location: 'Unbekannter Inselstandort' - specify-island-location: 'Gib denn Inselstandort in x,y,z Format an' + specify-island-location: 'Gib den Inselstandort im x,y,z Format an' player-has-more-than-one-island: 'Spieler hat mehr als eine Insel. Gib an welche.' info: parameters: @@ -334,7 +334,7 @@ commands: version: description: BentoBox und Addon-Versionen anzeigen setrange: - parameters: + parameters: description: Die Reichweite der Spielerinsel festlegen range-updated: 'Inselbereich aktualisiert auf [number].' placeholders: @@ -374,7 +374,7 @@ commands: island: 'Dies betrifft die Insel in [xyz], die ''[name]'' gehört.' confirmation: 'Möchtest du [xyz] wirklich als Schutzzentrum festlegen?' success: '[xyz] erfolgreich als Schutzzentrum festgelegt.' - fail: 'Fehler beim Festlegen von [xyz] als Schutzzentrum.' + fail: 'Fehler beim Festlegen von [xyz] als Schutzzentrum.' island-location-changed: '[user] hat das Schutzzentrum der Insel in [xyz] geändert.' xyz-error: 'Geben Sie drei ganzzahlige Koordinaten an: z. B. 100 120 100' setspawn: @@ -582,17 +582,17 @@ commands: success: 'Erfolgreiches Zurücksetzen von [name]''s Toden auf 0.' set: description: Legt die Tode des Spielers fest - parameters: + parameters: success: 'Erfolgreiche Einstellung von [name]''s Toden auf [number].' add: description: Fügt dem Spieler Tode hinzu - parameters: + parameters: success: >- Es wurde[number]Tode zu [name] hinzugefügt, wodurch sich die Gesamtzahl auf[total]Tode erhöht. remove: description: Entfernt Tode von dem Spieler - parameters: + parameters: success: >- Es wurden[number]Tode von [name] entfernt, wodurch sich die Gesamtzahl auf[total]Tode verringert hat. @@ -697,7 +697,7 @@ commands: description: >- Erstellt eine Insel, mit Hilfe einer optionalen Blaupause (erfordert Permission) - parameters: + parameters: too-many-islands: >- Es gibt zu viele Inseln auf dieser Welt: es gibt nicht genug Platz, um deine zu erstellen. @@ -746,7 +746,7 @@ commands: no-neighbors: 'Du hast keine unmittelbaren Nachbarinseln!' reset: description: Startet deine Insel neu und entfernt die alte - parameters: + parameters: none-left: 'Du hast keine Resets mehr übrig!' resets-left: 'Du hast[number]Resets übrig' confirmation: >- @@ -791,7 +791,7 @@ commands: already-exists: 'Dieser Name existiert bereits, versuche es mit einem anderen Namen.' resetname: description: Setze deinen Inselnamen zurück - success: 'Setzen Sie Ihren Inselnamen erfolgreich zurück.' + success: 'Dein Inselname wurde erfolgreich zurückgesetzt.' team: description: Dein Team verwalten gui: @@ -901,7 +901,7 @@ commands: reject um abzulehnen you-will-lose-your-island: | WARNUNG! Du verlierst alle - Inseln, wenn Sie akzeptieren! + Inseln, wenn du akzeptierst! gui: titles: team-invite-panel: Spieler einladen @@ -965,7 +965,7 @@ commands: kick: description: Entferne ein Mitglied von deiner Insel parameters: - player-kicked: 'Der [name] hat dich im [gamemode] von der Insel geworfen!' + player-kicked: '[name] hat dich im [gamemode] von der Insel geworfen!' cannot-kick: 'Du kannst dich nicht selbst kicken!' cannot-kick-rank: 'Dein Rang erlaubt es nicht, [name] zu kicken!' success: '[name]wurde von deiner Insel gekickt.' @@ -993,7 +993,7 @@ commands: cant-transfer-to-yourself: >- Du kannst dir das Eigentum nicht selbst übertragen! (Tja, eigentlich könntest du... Aber wir wollen nicht, dass du es tust. - Weil es sinnlos ist.& ) + Weil es sinnlos ist.) target-is-not-member: 'Dieser Spieler gehört nicht zu deinem Inselteam!' at-max: >- Dieser Spieler hat bereits die maximal zulässige Anzahl an @@ -1067,7 +1067,7 @@ protection: hint: Allay & Copper Golem Interaktion deaktiviert ANIMAL_NATURAL_SPAWN: description: Natürliches Spawnen von Tieren umschalten - name: Tier + name: Natürliches Tier-Spawnen ANIMAL_SPAWNERS_SPAWN: description: Schaltet das Spawnen von Tieren mit Spawnern um name: Tierspawner @@ -1078,7 +1078,7 @@ protection: ARMOR_STAND: description: Interaktion umschalten name: Rüstungsständer - hint: Rüstungsständnutzung deaktiviert + hint: Rüstungsständernutzung deaktiviert AXOLOTL_SCOOPING: name: Axolotl beim Schöpfen description: Lassen Sie Axolotl mit einem Eimer schöpfen @@ -1179,7 +1179,7 @@ protection: Bett- und Respawn-Anker zulassen , um Blöcke zu zerstören und zu beschädigen Entitäten. - name: Blockieren Sie Explosionsschaden + name: Block-Explosionsschaden COMPOSTER: name: Komposter description: Komposter-Interaktion umschalten @@ -1272,8 +1272,8 @@ protection: name: Pulverschnee sammeln hint: Pulverschneesammeln deaktiviert COMMAND_RANKS: - name: 'Befehlsreihenfolge' - description: 'Befehlsreihenfolge konfigurieren' + name: 'Befehlsränge' + description: 'Befehlsränge konfigurieren' CRAFTING: description: Umschalten der Nutzung name: Werkbänke @@ -1363,7 +1363,7 @@ protection: name: Feuerlöschen hint: Feuerlöschung deaktiviert FIRE_IGNITE: - name: Die Feuerzündung + name: Feuerzündung description: |- Umschalten, ob das Feuer mit Nicht-Spieler-Mitteln entzündet werden kann oder nicht. @@ -1399,8 +1399,8 @@ protection: HARVEST: description: |- Legt fest, wer Getreide ernten kann. - Vergiss nicht, das Item aufsammeln auch zuzulassen - zuzulassen! + Vergiss nicht, das Item-Aufsammeln + auch zuzulassen! name: Ernte hint: Ernte deaktiviert HIVE: @@ -1413,7 +1413,7 @@ protection: Schaden nehmen können. Deaktiviert bedeutet, dass sie nicht verletzt werden können. name: Verletze gezähmte Tiere - hint: Gezähmtes Tier verletzen deaktivert + hint: Gezähmte Tiere verletzen deaktiviert HURT_ANIMALS: description: Umschalten des Verletzens name: Tiere verletzen @@ -1608,8 +1608,8 @@ protection: hint: Netherportalnutzung deaktiviert END_PORTAL: description: Umschalten der Nutzung - name: Ende Portal - hint: Endportalnutzung deaktiviert + name: End-Portal + hint: End-Portal-Nutzung deaktiviert PAUSE_MOB_GROWTH: name: Mob-Wachstum pausieren description: |- @@ -1643,8 +1643,8 @@ protection: auf der Insel. name: Oberwelt PVP hint: 'PVP in der Oberwelt deaktiviert' - enabled: 'Der PVP in der Oberwelt wurde aktiviert.' - disabled: 'Der PVP in der Oberwelt wurde deaktiviert.' + enabled: 'Das PVP in der Oberwelt wurde aktiviert.' + disabled: 'Das PVP in der Oberwelt wurde deaktiviert.' REDSTONE: description: Umschalten der Nutzung name: Redstone Items @@ -1749,26 +1749,22 @@ protection: VISITOR_KEEP_INVENTORY: name: Besucher behalten ihr Inventar beim Tod description: |- - Verhindern Sie, dass Spieler ihre + Verhindert, dass Spieler ihre Gegenstände und Erfahrungen verlieren, wenn sie auf einer Insel - sterben, auf der sie ein Besucher + sterben, auf der sie Besucher sind. - Inselmitglieder verlieren immer - noch ihre Gegenstände, wenn sie + Inselmitglieder verlieren weiterhin + ihre Gegenstände, wenn sie auf ihrer eigenen Insel sterben! - Wenn sie aktiv sind, können - gezähmte Haustiere nur auf die - Heimatinsel des Besitzers gehen - und sie nicht verlassen. SPAWN_PROTECTION: - name: Spawn island void protection + name: Spawn-Insel Void-Schutz description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Wenn aktiviert, werden Spieler, die + auf der Spawn-Insel in die Leere fallen, + zum Spawnpunkt zurückteleportiert, + anstatt zu sterben. RAID_TRIGGER: name: Raid auslösen description: Legt den minimalen Inselrang fest, der zum Auslösen eines Raids benötigt wird @@ -1851,56 +1847,56 @@ protection: name-layout: '[name]' command-instructions: setname: | - Wählen Sie den Rang, der kann - Setzen Sie den Namen + Wähle den Rang, der + den Namen setzen darf ban: | - Wählen Sie den Rang, der kann - Spieler verbieten + Wähle den Rang, der + Spieler bannen darf unban: | - Wählen Sie den Rang, der kann - Unglaner Spieler + Wähle den Rang, der + Spieler entbannen darf expel: | - Wählen Sie den Rang, der kann - Besucher vertreiben + Wähle den Rang, der + Besucher vertreiben darf team-invite: | - Wählen Sie den Rang, der kann - einladen + Wähle den Rang, der + einladen darf team-kick: | - Wählen Sie den Rang, der kann - Kick + Wähle den Rang, der + kicken darf team-coop: | - Wählen Sie den Rang, der kann - Koop + Wähle den Rang, der + kooperieren darf team-trust: | - Wählen Sie den Rang, der kann - Vertrauen + Wähle den Rang, der + vertrauen darf team-uncoop: | - Wählen Sie den Rang, der kann - Entkoppeln + Wähle den Rang, der + Kooperation beenden darf team-untrust: | - Wählen Sie den Rang, der kann - nicht vertrauen + Wähle den Rang, der + Vertrauen entziehen darf team-promote: | - Wählen Sie den Rang, der kann - Fördern Sie den Rang des Spielers + Wähle den Rang, der + Spieler befördern darf team-demote: | - Wählen Sie den Rang, der kann - herabstufen der Rang des Spielers + Wähle den Rang, der + Spieler herabstufen darf sethome: | - Wählen Sie den Rang, der kann - Häuser einstellen + Wähle den Rang, der + Häuser setzen darf deletehome: | - Wählen Sie den Rang, der kann - vHäuser löschen + Wähle den Rang, der + Häuser löschen darf renamehome: | - Wählen Sie den Rang, der kann - Häuser umbenennen + Wähle den Rang, der + Häuser umbenennen darf setcount: | - Wählen Sie den Rang, der kann - Ändern Sie die Phase + Wähle den Rang, der + die Phase ändern darf border: | - Wählen Sie den Rang, der kann - Verwenden Sie den Grenzbefehl + Wähle den Rang, der + den Border-Befehl nutzen darf description-layout: |- [description] From 411b55063da9cdb7390380bdbce16c2a3a04d0d7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 20:59:32 -0700 Subject: [PATCH 29/95] Fix Spanish (es.yml) locale: correct mistranslations, typos, broken tags, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes untranslated English in maxsize, SPAWN_PROTECTION, and UI strings, wrong translations (cerveza/beer for brewing stand, Pañuelo/handkerchief for Crafter, Compuertas/floodgates for Composter, coral for Chorus, invisibles for invencibles), broken legacy color codes, typos throughout, an AI response left in conversation-prefix, and translated placeholders that should remain as English tokens. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/es.yml | 148 +++++++++++++++--------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/main/resources/locales/es.yml b/src/main/resources/locales/es.yml index 58503ee6c..29a407b73 100644 --- a/src/main/resources/locales/es.yml +++ b/src/main/resources/locales/es.yml @@ -27,8 +27,8 @@ general: player-has-no-island: 'Ese jugador no tiene una isla!' already-have-island: 'Ya tienes una isla!' no-safe-location-found: >- - No se pudo encontrar un lugar seguro para teletransportarlo a usted en - el éxito de la isla. + No se pudo encontrar un lugar seguro para teletransportarte en + la isla. not-owner: 'No eres el dueño de tu isla!' player-is-not-owner: '[name] no es dueño de una isla!' not-in-team: 'Ese jugador no está en tu equipo!' @@ -47,7 +47,7 @@ general: the-end: El Fin commands: help: - header: '=========== cBentoBox ===========' + header: '=========== [label] ayuda ===========' syntax: '[usage] [parameters]: [description]' syntax-no-parameters: '[usage]: [description]' end: '=================================' @@ -82,7 +82,7 @@ commands: description: Restablece los reinicios de este jugador a 0 parameters: success-everyone: 'Restablecer con éxito restablece a todos a 0 .' - success: 'Restablecer con éxito & b [name] 0 .' + success: 'Reiniciados con éxito los reinicios de [name] a 0.' add: description: se suma a cuántas veces este jugador reinició su isla parameters: @@ -110,14 +110,14 @@ commands: config.yml de BentoBox. Luego ejecuta un purge. - purge-in-progress: 'Purgaen progreso. Use la parada de purga para cancelar' + purge-in-progress: 'Purga en progreso. Usa purge stop para cancelar' scanning: >- Escaneando islas en la base de datos. Esto puede tardar un tiempo dependiendo de cuántas tengas... scanning-in-progress: 'Escaneando en progreso, por favor espera' none-found: 'No se encontraron islas para purgar.' total-islands: 'Tienes [number] islas en tu base de datos en todos los mundos.' - number-error: 'El argumento debe ser varios días' + number-error: 'El argumento debe ser un número de días' confirm: 'Escribe [label] purga confirmar para iniciar la purga' completed: 'La purga se detuvo' see-console-for-status: La purga comenzó. Ver consola para el estado @@ -129,7 +129,7 @@ commands: protect: description: Activar protección de purga de isla move-to-island: '¡Muévete primero a una isla!' - protecting: 'Remover isla protegida' + protecting: 'Isla protegida contra purga' unprotecting: 'Eliminación de la protección de purga' stop: description: Detener una purga en progreso @@ -140,7 +140,7 @@ commands: status: description: muestra el estado de la purga status: >- - [purged] islas purgadas de [purgeable] & 7 (& b [percentage] + [purged] islas purgadas de [purgeable] ([percentage] %). team: description: gestionar equipos @@ -186,10 +186,10 @@ commands: Advertencia: este jugador ahora posee [number] islas. Esto es más de lo permitido por la configuración o permisos: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Establecer el tamaño máximo de equipo para la [prefix_island] de un jugador (usa 0 para restablecer al valor predeterminado del mundo) + success: 'Tamaño máximo de equipo de [name] en [prefix_island] establecido a [number].' + reset: 'Tamaño máximo de equipo de [name] en [prefix_island] restablecido al valor predeterminado del mundo ([number]).' range: description: Comando de rango de la isla de administración invalid-value: @@ -258,7 +258,7 @@ commands: parameters: description: Obtén información sobre dónde estás o la isla del jugador. no-island: 'No estás en una isla en este momento...' - title: '========== Island Info ============' + title: '========== Info de la Isla ============' island-uuid: 'UUID: [uuid]' owner: 'Propietario: [owner] ([uuid])' last-login: 'Último acceso: [date]' @@ -274,15 +274,15 @@ commands: max-trusted-size: 'Tamaño máximo de confianza: [number]' island-protection-center: 'Centro del área de protección: [xyz]' island-center: '[prefix_Island] centro: [xyz]' - island-coords: 'Coordenadas de la isla: [xz1] to [xz2]' + island-coords: 'Coordenadas de la isla: [xz1] a [xz2]' islands-in-trash: 'El jugador tiene islas en la basura.' protection-range: 'Rango de protección: [range]' protection-range-bonus-title: 'Incluye estos bonificaciones:' protection-range-bonus: 'Bonificación: [number]' purge-protected: La isla está protegida por purga max-protection-range: 'El mayor rango de protección histórica: [range]' - protection-coords: 'Coordenadas de proteccion: [xz1] to [xz2]' - is-spawn: La isla es una isla engendrada. + protection-coords: 'Coordenadas de protección: [xz1] a [xz2]' + is-spawn: La isla es el spawn banned-players: 'Jugadores prohibidos:' banned-format: '[name]' unowned: 'Sin propietario' @@ -305,7 +305,7 @@ commands: no-islands-in-trash: 'El jugador no tiene islas en la basura' parameters: '[player]' description: Mostrar islas sin propietarios o islas de jugadores en la basura - title: '=========== Islands in Trash ===========' + title: '=========== Islas en la Basura ===========' count: 'Isla [number]:' use-switch: >- Usa [label] switchto para cambiar el jugador a @@ -316,7 +316,7 @@ commands: emptytrash: parameters: '[player]' description: Borrar basura para el jugador, o todas las islas sin dueño en la basura - success: 'Trash se vació con éxito.' + success: 'La basura se vació con éxito.' version: description: Mostrar versiones de BentoBox y complementos setrange: @@ -361,7 +361,7 @@ commands: protección? success: 'Se ha establecido correctamente [xyz] como el centro de protección.' fail: 'Falló al establecer [xyz] como el centro de protección.' - island-location-changed: '[usuario] cambió el centro de protección de [prefijo_isla] a [xyz].' + island-location-changed: '[user] cambió el centro de protección de [prefix_island] a [xyz].' xyz-error: 'Especifica tres coordenadas enteras: p.ej, 100 120 100' setspawn: description: 'Establecer una isla como spawn para este mundo ' @@ -370,7 +370,7 @@ commands: confirmation: >- Estás seguro de que quieres establecer esta isla como el spawn de este mundo? - success: 'Con éxito establece esta isla como el engendro de este mundo.' + success: 'Esta isla se ha establecido con éxito como el spawn de este mundo.' setspawnpoint: description: establecer la ubicación actual como punto de generación para esta isla no-island-here: 'No hay isla aquí.' @@ -426,8 +426,8 @@ commands: no-blueprint: '[name] no existe.' confirmation: | ¿Está seguro de que desea eliminar este plano? - c Una vez eliminado, no hay forma de recuperarlo. - success: 'Borrado exitosamente el plano & b [name] .' + Una vez eliminado, no hay forma de recuperarlo. + success: 'Borrado exitosamente el plano [name].' load: parameters: description: Cargar esquema en el portapapeles @@ -451,7 +451,7 @@ commands: parameters: description: renombrar un plano success: >- - Blueprint & b [old] & a ha sido renombrado con éxito a [name] + El plano [old] ha sido renombrado con éxito a [name] . pick-different-name: >- Especifique un nombre que sea diferente del nombre actual del @@ -491,7 +491,7 @@ commands: Se eliminaron algunos caracteres porque no están permitidos. La nueva ID será [name]. success: ¡Éxito! - conversation-prefix: Sure! Please provide the text you'd like me to translate. + conversation-prefix: '>' description: quit: dejar instructions: |- @@ -502,8 +502,8 @@ commands: cancelling: Cancelado slot: 'Ranura preferida [number]' slot-instructions: |- - Haga clic para aumentar - Haga clic para disminuir + Clic izquierdo para aumentar + Clic derecho para disminuir times: |- Máx. usos concurrentes por jugador Clic izquierdo para incrementar @@ -568,7 +568,7 @@ commands: reset: description: Reinicia las muertes del jugador. parameters: - success: 'Reinciciadas con exito las muertes de [name]a 0.' + success: 'Reiniciadas con éxito las muertes de [name] a 0.' set: description: establece las muertes del jugador parameters: @@ -583,7 +583,7 @@ commands: description: elimina muertes al jugador parameters: success: >- - Eliminado exitosamente [number] demuertes a [name], + Eliminadas exitosamente [number] de muertes a [name], disminuyendo el total a [total] de muertes. resetname: description: reiniciar jugador [prefix_island] nombre @@ -627,7 +627,7 @@ commands: addon-syntax: '[name] [version] ([state])' game-world: '[name] ([addon]): Mundo, Nether, End' server: 'Corriendo [name] [version].' - database: 'ase de datos: [database]' + database: 'Base de datos: [database]' manage: description: Mostrar el panel de gestión catalog: @@ -664,7 +664,7 @@ commands: delay: previous-command-cancelled: 'Anterior comando cancelado' stand-still: '¡No te muevas! Teletransportación en [seconds] segundos' - moved-so-command-cancelled: 'Te mudaste. Teleport cancelado!' + moved-so-command-cancelled: 'Te moviste. ¡Teletransporte cancelado!' island: about: description: Acerca de este addon @@ -741,7 +741,7 @@ commands: No hay vuelta atrás: una vez que se elimine su isla actual, habrá no forma de recuperarla más adelante. kicked-from-island: >- - Se te ha explusado de tu isla en [gamemode] porque el propietario la + Se te ha expulsado de tu isla en [gamemode] porque el propietario la está reiniciando. sethome: description: configura tu punto de teletransportación @@ -814,9 +814,9 @@ commands: info: description: Muestra información detallada sobre tu equipo. member-layout: - online: ' o [nombre]' + online: ' o [name]' offline: ' o [name] ([last_seen])' - offline-not-last-seen: ' o [nombre]' + offline-not-last-seen: ' o [name]' last-seen: layout: 'Hace [number] [unit]' days: dias @@ -824,7 +824,7 @@ commands: minutes: minutos header: |- --- Detalles del equipo --- - Miembros: [total] / [ max] + Miembros: [total]/[max] Miembros en línea: [online] rank-layout: owner: '[rank]:' @@ -845,7 +845,7 @@ commands: cannot-uncoop-yourself: 'No puedes remover permisos a ti mismo' cannot-uncoop-member: 'No puedes remover los permisos a un miembro de tu equipo!' player-not-cooped: 'Ese jugador no tiene permisos!' - you-are-no-longer-a-coop-member: 'Yano tienes permisos en la isla de [name]' + you-are-no-longer-a-coop-member: 'Ya no tienes permisos en la isla de [name]' all-members-logged-off: >- Todos los miembros de la isla se desconectaron, ya no tienes permisos en la isla de [name] @@ -858,12 +858,12 @@ commands: name-has-invited-you: >- [name] te ha invitado a unirte para ser un miembro confiable de su isla. - player-already-trusted: 'Player ya es de confianza!' + player-already-trusted: '¡El jugador ya es de confianza!' you-are-trusted: 'Has sido confiado por [name]!' success: 'Confió en [name] .' is-full: 'No puedes confiar en nadie más.' untrust: - description: eliminar el rango de jugador de confianza del jugadorr + description: eliminar el rango de confianza del jugador parameters: cannot-untrust-yourself: 'No puedes desconfiar de ti mismo!' cannot-untrust-member: 'No puedes desconfiar de un miembro del equipo!' @@ -873,7 +873,7 @@ commands: invite: description: invita a un jugador a unirse a tu isla invitation-sent: 'Invitación enviada a [name]' - removing-invite: 'Eliminando invitar' + removing-invite: 'Eliminando invitación' name-has-invited-you: '[name] Te ha invitado a unirte a su isla.' to-accept-or-reject: >- Pon /[label] team accept para aceptar, o /[label] team reject para @@ -953,14 +953,14 @@ commands: failure: 'El jugador no puede ser degradado más!' success: 'Degradar a [name] a [rank]' promote: - description: promoveer a un jugador en tu isla un rango + description: promover a un jugador en tu isla un rango parameters: errors: cant-promote-yourself: '¡No puedes promoverte a ti mismo!' cant-promote: '¡No puedes promoverte por encima de tu rango!' must-be-member: '¡El jugador debe ser miembro de [prefix_an-island]!' failure: 'El jugador no puede ser promovido más' - success: 'Promoveer a [name] a [rank]' + success: 'Promovido [name] a [rank]' setowner: description: transfiere la propiedad de tu isla a un miembro errors: @@ -979,8 +979,8 @@ commands: description: banea a un jugador de tu isla parameters: cannot-ban-yourself: 'No puedes banearte a ti mismo!' - cannot-ban: 'Es jugador no puede ser baneado.' - cannot-ban-member: 'Saca primero al miembre, y despues lo baneas.' + cannot-ban: 'Ese jugador no puede ser baneado.' + cannot-ban-member: 'Saca primero al miembro, y después lo baneas.' cannot-ban-more-players: >- Haz llenado tu lista de baneos, No Puedes banear a mas jugadores de tu isla. @@ -1041,7 +1041,7 @@ protection: hint: Interacción de Allay y Copper Golem deshabilitada ANIMAL_NATURAL_SPAWN: description: Alternar el desove natural de animales - name: Engendro natural animal + name: Aparición natural de animales ANIMAL_SPAWNERS_SPAWN: description: Alternar el desove de animales con reproductores name: Spawners de animales @@ -1101,8 +1101,8 @@ protection: hint: Cría de animales protegida BREWING: description: Interacción - name: Estante de cerveza - hint: No se permite la elaboración de cerveza + name: Soporte de pociones + hint: No se permite elaborar pociones BUCKET: description: Interacción del cubo name: Cubos @@ -1132,7 +1132,7 @@ protection: por banderas dedicadas. hint: Acceso al contenedor deshabilitado CHEST: - name: Cajas y cajas de minecart + name: Cofres y vagonetas con cofre description: |- Activar interacción con cofres y vagones de mina de cofres. @@ -1143,7 +1143,7 @@ protection: description: Cambiar la interacción con el barril hint: Acceso al barril deshabilitado CRAFTER: - name: Pañuelo + name: Crafter description: Alternar uso hint: Acceso de Crafter deshabilitado BLOCK_EXPLODE_DAMAGE: @@ -1153,7 +1153,7 @@ protection: entidades. name: Daño de explosión de bloque COMPOSTER: - name: Compuertas + name: Compostadores description: Alternar interacción con el compostador hint: Interacción con el compostador deshabilitada LOOM: @@ -1204,13 +1204,13 @@ protection: HOPPER: name: Tolvas description: Interacción de la Tolva - hint: Interacción de la Tova deshabilitado + hint: Interacción de la Tolva deshabilitada CHEST_DAMAGE: description: Alternar daño en el cofre por explosiones. name: Daño por Cofre CHORUS_FRUIT: description: Teletransporte - name: Fruta del coral + name: Fruta de Chorus hint: No teletransporte CLEAN_SUPER_FLAT: description: |- @@ -1382,8 +1382,8 @@ protection: description: >- Alternar daño. Habilitado significa que los animales domesticados pueden recibir daño. Deshabilitado significa que son invencibles. - name: Hurt animales domesticados - hint: Animal domesticado lastimando desactivado + name: Dañar animales domesticados + hint: Dañar animales domesticados desactivado HURT_ANIMALS: description: Modificar daño a los animales name: Daño a los animales @@ -1409,11 +1409,11 @@ protection: description: |- Configurar la configuración de visitantes invencibles. - name: 'Visitantes invisibles' + name: 'Visitantes invencibles' hint: 'Visitantes protegidos' ISLAND_RESPAWN: description: |- - Jugadores respawnearn + Los jugadores reaparecerán en la isla name: Isla respawn ITEM_DROP: @@ -1451,7 +1451,7 @@ protection: LIMIT_MOBS: description: |- Limitar entidades a - spawner en este mode + aparecer en este modo de juego. name: 'Limitar el spawn de la entidad' can: 'Pueden aparecer' @@ -1540,9 +1540,9 @@ protection: OFFLINE_REDSTONE: description: |- Cuando se deshabilita, la redstone - no operará en islas - donde todos los miembros están fuera de línea. - Puede ayudar a reducir el lag. + no operará en islas + donde todos los miembros están fuera de línea. + Puede ayudar a reducir el lag. name: Redstone Fuera de linea PETS_STAY_AT_HOME: description: |- @@ -1644,8 +1644,8 @@ protection: hint: No arrojar huevos de spawn SPAWNER_SPAWN_EGGS: description: |- - Permite cambiar el tipo de entidad de un generador - ausando huevos de desove. + Permite cambiar el tipo de entidad de un spawner + usando huevos de aparición. name: Huevos de spawnen spawners hint: >- no está permitido cambiar el tipo de entidad de un spawner usando huevos @@ -1693,14 +1693,14 @@ protection: fuera del rango de protección de una isla sino que también bloqueará la generación de hojas / troncos fuera de la isla - ortando así el árbol. + cortando así el árbol. TURTLE_EGGS: description: Modificar aplastante name: Huevos de tortuga hint: Los huevos de tortuga no pueden ser aplastados! FROST_WALKER: description: Modificar Encantamiento de Frost Walker - name: Walker de Hielo + name: Caminante de Escarcha hint: Frost Walker no puede ser usado aquí EXPERIENCE_PICKUP: name: Recoger experiencia @@ -1723,12 +1723,12 @@ protection: Los miembros de [prefix_Island] aún pierden sus objetos si mueren en su propio [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protección del vacío en la isla spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Cuando está activado, los jugadores que caigan + al vacío en la isla spawn + serán teletransportados de vuelta al + punto de aparición en lugar de morir. RAID_TRIGGER: name: Activador de asalto description: Establece el rango mínimo de isla requerido para activar un asalto @@ -1747,7 +1747,7 @@ protection: pueden usar cargas de viento en esta isla. hint: Uso de carga de viento desactivado WITHER_DAMAGE: - name: Alternar el daño de marchitar + name: Alternar el daño de Wither description: |- Si está activo, Withers puede dañar bloques y jugadores @@ -1806,7 +1806,7 @@ protection: title: '[world_name] Protecciones de mundos' description: |- Configuración de protección cuando - player está fuera de su isla + el jugador está fuera de su isla flag-item: name-layout: '[name]' command-instructions: @@ -1815,7 +1815,7 @@ protection: establecer el nombre ban: |- Selecciona el rango que puede - banear jugadores + banear jugadores unban: |- Selecciona el rango que puede desbanear jugadores @@ -1922,7 +1922,7 @@ management: SUPPORTED: | Corriendo [name] [version]. BentoBox esta corriendo en una version - SOPORTADA &por el server software y + SOPORTADA por el server software y version. La mayoría de sus características se ejecutarán sin problemas en este ambiente. @@ -1946,7 +1946,7 @@ catalog: GAMEMODES: title: Catalogo de Modo de juegos ADDONS: - title: Catalogo de Addos + title: Catálogo de Addons views: gamemodes: name: 'Modo De Juegos' @@ -1992,7 +1992,7 @@ enums: LIGHTNING: Rayos SUICIDE: Suicidio STARVATION: Hambruna - POISON: 'Veneno' + POISON: Veneno MAGIC: Magia WITHER: Wither FALLING_BLOCK: Bloque Caído @@ -2000,7 +2000,7 @@ enums: DRAGON_BREATH: Aliento de Dragón CUSTOM: Personalizado FLY_INTO_WALL: Vuela Hacia la Pared - HOT_FLOOR: 'Suelo Caliente' + HOT_FLOOR: Suelo Caliente CRAMMING: Cramming DRYOUT: Secado FREEZE: Congelar From 770b3d1725b76fd77e7d15cd481406a7e3719873 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:10:50 -0700 Subject: [PATCH 30/95] Fix French (fr.yml) locale: fix 30+ broken legacy tags, mistranslations, typos, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes pervasive &un/&une broken legacy color codes throughout flag descriptions, untranslated English in maxsize/SPAWN_PROTECTION/several flag names, wrong translations (Automne/Autumn for Fall, Minerai for Briquet, Tirants for Droppers, chœur for Chorus, Frappez for Expulsez), reversed unban messages, AI response in conversation-prefix, translated placeholders, missing 'B' in Bienvenue, and many other issues. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/fr.yml | 277 +++++++++++++++--------------- 1 file changed, 143 insertions(+), 134 deletions(-) diff --git a/src/main/resources/locales/fr.yml b/src/main/resources/locales/fr.yml index 40e9ac2fe..493430c7c 100644 --- a/src/main/resources/locales/fr.yml +++ b/src/main/resources/locales/fr.yml @@ -172,7 +172,7 @@ commands: données rank-on-island: '[rank] sur l''île à [xyz]' fixed: 'Fixe' - done: '&Un scanner' + done: 'Analyse terminée' kick: parameters: description: Kicker le joueur de son équipe @@ -197,10 +197,10 @@ commands: plus que ce qui est autorisé par les paramètres ou les permissions : [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Définir la taille max d'équipe pour l'[prefix_island] d'un joueur (0 pour revenir au défaut du monde) + success: 'Taille max d''équipe de [name] sur [prefix_island] définie à [number].' + reset: 'Taille max d''équipe de [name] sur [prefix_island] réinitialisée au défaut du monde ([number]).' range: description: rayon de la zone de protection de l'île invalid-value: @@ -296,14 +296,14 @@ commands: max-trusted-size: 'Taille maximale de confiance : [number]' island-protection-center: "Centre de la zone de protection\_: [xyz]" island-center: "Centre de l'île\_: [xyz]" - island-coords: 'Coordonnées de l''île : [xz1] to [xz2]' + island-coords: 'Coordonnées de l''île : [xz1] à [xz2]' islands-in-trash: 'Le joueur a des îles dans la Corbeille.' protection-range: 'Rayon de protection : [range]' protection-range-bonus-title: "Comprend ces bonus\_:" protection-range-bonus: "Bonus\_:\_[number]" purge-protected: L'île est protégée contre la purge max-protection-range: 'La plus grande gamme de protection historique: [range]' - protection-coords: 'Coordonnées de protection: [xz1] to [xz2]' + protection-coords: 'Coordonnées de protection : [xz1] à [xz2]' is-spawn: L'île est un spawn banned-players: 'Joueurs bannis : ' banned-format: '[name]' @@ -381,7 +381,7 @@ commands: description: définir le rang d'un joueur sur son île ou sur celle du propriétaire unknown-rank: 'Rang inconnu!' not-possible: 'Le classement doit être supérieur à celui du visiteur.' - rank-set: 'Rang défini de [from] à [to] &sur l''île de [name].' + rank-set: 'Rang défini de [from] à [to] sur l''île de [name].' setprotectionlocation: parameters: '[coordonnées x y z]' description: >- @@ -516,7 +516,7 @@ commands: Certains caractères ont été supprimés car ils ne sont pas autorisés. Le nouvel identifiant sera [name]. success: Succès! - conversation-prefix: Sure! Please provide the text you would like to have translated. + conversation-prefix: '>' description: quit: quitter instructions: >- @@ -565,7 +565,7 @@ commands: config.yml confirm: 'Cela réinitialisera les flags par défaut pour toutes les îles!' success: 'Réinitialisation des flags de toutes les îles aux valeurs par défaut.' - success-one: 'flag[name] défini par défaut pour toutes' + success-one: 'Flag [name] défini par défaut pour toutes les îles.' world: description: Gérer les paramètres du monde delete: @@ -680,7 +680,7 @@ commands: list: 'Les rangs enregistrés sont les suivants :' confirmation: confirm: >- - Entrez à nouveau la commande dans [secondes] secondes pour + Entrez à nouveau la commande dans [seconds] secondes pour confirmer. previous-request-cancelled: 'La demande de confirmation est annulée.' request-cancelled: 'Délai de confirmation dépassé - demande annulée.' @@ -727,13 +727,13 @@ commands: estimated-time: 'Durée estimée : [number] secondes.' blocks: 'Construire bloc par bloc: [number] blocs en tout ...' entities: 'Remplissage avec des entités : [number] entités en tout ...' - dimension-done: '&Une île dans [world] est construite.' + dimension-done: 'L''île dans [world] est construite.' done: 'C''est fait! Votre île est prête et vous attend!' pick: 'Choisissez une île' cannot-afford: 'Vous ne pouvez pas vous le permettre ! Coût : [cost]' unknown-blueprint: 'Ce blueprint n''existe pas.' on-first-login: >- - ienvenue! Nous commencerons à préparer votre île dans quelques + Bienvenue ! Nous commencerons à préparer votre île dans quelques secondes. you-can-teleport-to-your-island: 'Vous pouvez vous téléporter sur votre île quand vous le désirez.' deletehome: @@ -840,7 +840,7 @@ commands: description: afficher des informations détaillées sur votre équipe member-layout: online: 'o [name]' - offline: 'o [name] ([last_seen])' + offline: 'o [name] ([last_seen])' offline-not-last-seen: 'o [name]' last-seen: layout: 'il y a [number] [unit]' @@ -898,7 +898,7 @@ commands: name-has-invited-you: '[name] vous a invité à rejoindre son île.' to-accept-or-reject: >- Faites /[label] team accept pour accepter ou /[label] team - reject] pour refuser. + reject pour refuser. you-will-lose-your-island: 'ATTENTION ! Vous perdrez votre île actuelle si vous acceptez !' gui: titles: @@ -962,9 +962,9 @@ commands: kick: description: supprimer un membre de votre île parameters: - player-kicked: "Le [name] vous a expulsé de l'île en [mode de jeu]\_!" - cannot-kick: 'Vous ne pouvez pas vous botter!' - cannot-kick-rank: "Votre rang ne vous permet pas de donner un coup de pied à [name]\_!" + player-kicked: '[name] vous a expulsé de l''île en [gamemode] !' + cannot-kick: 'Vous ne pouvez pas vous expulser vous-même !' + cannot-kick-rank: 'Votre rang ne vous permet pas d''expulser [name] !' success: '[name] a été exclu de votre île.' demote: description: rétrograder un joueur de votre île à un rang inférieur @@ -974,7 +974,7 @@ commands: cant-demote: "Vous ne pouvez pas rétrograder des rangs supérieurs\_!" must-be-member: 'Le joueur doit être membre de [prefix_an-island]!' failure: 'Le joueur ne peut plus être rétrogradé!' - success: '&un [name] rétrogradé à [rank]' + success: '[name] rétrogradé à [rank]' promote: description: promouvoir un joueur de votre île à un rang supérieur parameters: @@ -983,7 +983,7 @@ commands: cant-promote: "Vous ne pouvez pas promouvoir au-dessus de votre rang\_!" must-be-member: 'Le joueur doit être membre de [prefix_an-island]!' failure: 'Le joueur ne peut plus être promu!' - success: '&un [name] promu au [rank]' + success: '[name] promu au [rank]' setowner: description: transférer la propriété de votre île à un membre errors: @@ -1001,24 +1001,24 @@ commands: parameters: cannot-ban-yourself: 'Vous ne pouvez pas vous interdire!' cannot-ban: 'Ce joueur ne peut pas être banni.' - cannot-ban-member: 'Frappez d''abord le membre de l''équipe, puis bannissez.' + cannot-ban-member: 'Expulsez d''abord le membre de l''équipe, puis bannissez.' cannot-ban-more-players: >- Vous avez atteint la limite d'interdiction, vous ne pouvez plus interdire d'autres joueurs de votre île. - player-already-banned: 'Player est déjà banni.' + player-already-banned: 'Le joueur est déjà banni.' player-banned: '[name] est désormais banni de votre île.' owner-banned-you: '[name] vous a banni de leur île!' you-are-banned: 'Vous êtes banni de cette île!' unban: description: débannir un joueur de votre île parameters: - cannot-unban-yourself: 'Vous ne pouvez pas vous défaire!' - player-not-banned: 'Le lecteur n''est pas interdit.' - player-unbanned: '[name] est désormais interdit sur votre île.' - you-are-unbanned: '[name] vous a banni de leur île!' + cannot-unban-yourself: 'Vous ne pouvez pas vous débannir vous-même !' + player-not-banned: 'Ce joueur n''est pas banni.' + player-unbanned: '[name] n''est plus banni de votre île.' + you-are-unbanned: '[name] vous a débanni de son île !' banlist: description: lister les joueurs bannis - noone: 'Personne n''est interdit sur cette île.' + noone: 'Personne n''est banni de cette île.' the-following: 'Les joueurs suivants sont bannis:' names: '[line]' you-can-ban: 'Vous pouvez bannir jusqu''à [number] joueurs supplémentaires.' @@ -1061,11 +1061,11 @@ protection: description: Autoriser le don et le transport d'objets vers/depuis Allay et Copper Golem hint: Interaction Allay & Copper Golem désactivée ANIMAL_NATURAL_SPAWN: - description: Activer/désactiver le frai naturel des animaux - name: Frai naturel des animaux + description: Activer/désactiver l'apparition naturelle des animaux + name: Apparition naturelle des animaux ANIMAL_SPAWNERS_SPAWN: - description: Activer/désactiver le frai des animaux avec des géniteurs - name: reproducteurs d'animaux + description: Activer/désactiver l'apparition des animaux avec des spawners + name: Spawners d'animaux ANVIL: description: Autoriser l'utilisation des enclumes name: Enclumes @@ -1123,9 +1123,9 @@ protection: name: Alambics hint: Brassage désactivé BUCKET: - description: vous ne pouvez pas utiliser les alambics + description: Autoriser l'utilisation des seaux name: Seaux - hint: Utilisation du godet désactivée + hint: Utilisation des seaux désactivée BUTTON: description: Autoriser l'interaction avec les boutons name: Boutons @@ -1145,34 +1145,34 @@ protection: CONTAINER: name: Conteneurs description: |- - et une interaction Toggle avec les coffres, - &un shulker boîtes et pots de fleurs, - &un composteurs et des barils. + Activer/désactiver l'interaction avec les coffres, + boîtes de Shulker, pots de fleurs, + composteurs et barils. - D'autres conteneurs sont manipulés + D'autres conteneurs sont gérés par des drapeaux dédiés. hint: vous ne pouvez pas ouvrir les conteneurs CHEST: name: Coffres et coffres de minecart description: |- Activer/désactiver l'interaction avec les coffres - &un et des minecarts de coffre. + et les minecarts de coffre. (n'inclut pas les coffres piégés) - hint: Accès à la coffre désactivé + hint: Accès au coffre désactivé BARREL: name: Barils - description: Activer/désactiver l'interaction du canon + description: Activer/désactiver l'interaction du baril hint: Accès au baril désactivé CRAFTER: - name: Artisan - description: Faire de l'utilisation - hint: Crafter Accès désactivé + name: Crafter + description: Basculer l'utilisation + hint: Accès au Crafter désactivé BLOCK_EXPLODE_DAMAGE: description: |- Autoriser les ancres de lit et de réapparition pour briser les blocs et endommager entités. - name: Bloquer les dégâts d'explosion + name: Dégâts d'explosion de bloc COMPOSTER: name: Composteurs description: Activer/Désactiver l'interaction du composteur @@ -1195,7 +1195,7 @@ protection: hint: Accès à la boîte Shulker désactivé SHULKER_TELEPORT: description: |- - &un Shulker peut se téléporter + Le Shulker peut se téléporter si actif. name: Téléportation de Shulker SMITHING: @@ -1215,7 +1215,7 @@ protection: description: Autoriser l'interaction avec dispensers hint: vous ne pouvez pas interagir avec les dispensers DROPPER: - name: Tirants + name: Droppers description: Autoriser l'interaction avec les droppers hint: vous ne pouvez pas interagir avec les droppers ELYTRA: @@ -1231,31 +1231,31 @@ protection: name: Dégâts de Coffre CHORUS_FRUIT: description: Activer/désactiver la téléportation - name: Fruits de chœur - hint: Téléportation des fruits du choeur désactivée + name: Fruits de Chorus + hint: Téléportation des fruits de Chorus désactivée CLEAN_SUPER_FLAT: description: |- - Activer pour nettoyer tout - es morceaux super plats dans - &un monde insulaire + Activer pour nettoyer tous + les chunks super plats dans + les mondes d'îles name: Nettoyer Super Plat COARSE_DIRT_TILLING: description: |- - &Un basculement grossier du labour - &un podzol sale et cassant - pour obtenir la saleté + Activer/désactiver le labourage de + la terre grossière et la destruction + du podzol pour obtenir de la terre name: Labour de terre grossière hint: Pas de labour de terre friche COLLECT_LAVA: description: |- - &un Toggle collecte de lave - (remplacer les compartiments) + Activer/désactiver la collecte de lave + (remplace les Seaux) name: Collecter de la lave hint: Pas de collecte de lave COLLECT_WATER: description: |- - &un Toggle collectant l'eau - (remplacer les compartiments) + Activer/désactiver la collecte d'eau + (remplace les Seaux) name: Collecter de l'eau hint: Seaux d'eau désactivés COLLECT_POWDERED_SNOW: @@ -1272,19 +1272,19 @@ protection: name: Tables de crafting hint: Accès au plan de travail désactivé CREEPER_DAMAGE: - description: Toggle creeper damage + description: Activer/désactiver les dégâts de Creeper name: Dégâts de Creeper CREEPER_GRIEFING: - description: Toggle creeper griefing - name: Creeper griefing - hint: Creeper chagrin désactivé + description: Activer/désactiver le griefing de Creeper + name: Griefing de Creeper + hint: Griefing de Creeper désactivé CROP_PLANTING: description: 'Définir qui peut planter des graines.' name: Plantation de cultures hint: Plantation de cultures désactivée CROP_TRAMPLE: description: Basculer le piétinement des cultures - name: '&p&Écraser les cultures' + name: Piétinement des cultures hint: Piétinement des cultures désactivé DOOR: description: Bascule l'utilisation de la porte @@ -1316,14 +1316,14 @@ protection: hint: Les coffres de l'Ender sont désactivés dans ce monde. ENDERMAN_DEATH_DROP: description: |- - &un Endermen tombera - et un bloc qu'ils sont - &un holding s'il est tué. + Les Endermen lâcheront + tout bloc qu'ils tiennent + s'ils sont tués. name: Drop de mort d'Enderman ENDERMAN_GRIEFING: description: |- - &un Endermen peut supprimer - &un pâté de maisons des îles + Les Endermen peuvent retirer + des blocs des îles name: Griefing par des Endermen ENDERMAN_TELEPORT: description: |- @@ -1331,7 +1331,7 @@ protection: si actif. name: Téléportation Enderman ENDER_PEARL: - description: Faire de l'utilisation + description: Basculer l'utilisation name: Perles d'Ender hint: Utilisation d'Enderpearl désactivée ENTER_EXIT_MESSAGES: @@ -1349,8 +1349,8 @@ protection: FIRE_BURNING: name: Feu qui brûle description: |- - bascule si le feu peut brûler - &un bloc ou non. + Bascule si le feu peut brûler + des blocs ou non. FIRE_EXTINGUISH: description: Basculer l'extinction des feux name: Éteindre le feu @@ -1370,7 +1370,7 @@ protection: description: Autoriser la capture de poissons avec un seau hint: Écopage de poisson désactivé FLINT_AND_STEEL: - name: Minerai de silex et d'acier + name: Briquet description: |- Autorise les joueurs à allumer des feux ou des feux de camp en utilisant @@ -1386,12 +1386,15 @@ protection: hint: Utilisation de la porte désactivée GEO_LIMIT_MOBS: description: |- - Supprimer les mobs qui partent - &un extérieur protégé - &un espace insulaire + Supprimer les mobs qui sortent + de l'espace protégé + de l'île name: 'Limiter les foules à l''île' HARVEST: - description: "Définir qui peut récolter les récoltes.\nN'oubliez pas d'autoriser l'élément\n& un pick-up aussi\_!" + description: |- + Définir qui peut récolter les cultures. + N'oubliez pas d'autoriser le ramassage + d'objets aussi ! name: Récolte des cultures hint: Récolte désactivée HIVE: @@ -1406,37 +1409,37 @@ protection: hint: Animal apprivoisé blessé désactivé HURT_ANIMALS: description: Activer/Désactiver les dégâts - name: 'Animaux blessés' - hint: Animal blessé handicapé + name: Blesser les animaux + hint: Blesser les animaux désactivé HURT_MONSTERS: description: Activer/Désactiver les dégâts - name: Monstres blessés - hint: Monstre blessé désactivé + name: Blesser les monstres + hint: Blesser les monstres désactivé HURT_VILLAGERS: description: Activer/désactiver les dégâts - name: Villagers blessés - hint: Villageois blessé handicapé + name: Blesser les villageois + hint: Blesser les villageois désactivé ITEM_FRAME: name: Cadre d'objet description: |- - une interaction Toggle. - Remplace le lieu ou brise les blocs + Activer/désactiver l'interaction. + Remplace le placement ou la destruction de blocs hint: L'utilisation du cadre d'objet est désactivée ITEM_FRAME_DAMAGE: description: |- - un Mobs peut endommager - un élément cadres + Les mobs peuvent endommager + les cadres d'objet name: Dégât de Cadre d'Objet INVINCIBLE_VISITORS: description: |- - onfigurer un visiteur invincible - &un paramètres. + Configurer les paramètres + des visiteurs invincibles. name: 'Visiteurs invincibles' hint: 'Visiteurs protégés' ISLAND_RESPAWN: description: |- - Joueurs réapparaissent - &un sur l'île + Les joueurs réapparaissent + sur l'île name: Island respawn ITEM_DROP: description: Basculer le lâcher @@ -1486,8 +1489,8 @@ protection: Basculez si les liquides peuvent s'écouler à l'extérieur de la gamme de protection de l'île. Le désactiver permet d'éviter la lave et l'eau - pavé générateur dans la zone entre - eux îles. + de générer de la pierre entre + deux îles. Notez que les liquides continueront de couler verticalement. Ils ne se répandront pas non plus horizontalement si @@ -1495,19 +1498,19 @@ protection: plage de protection. LOCK: description: Basculer le verrou - name: Lock island + name: Verrouiller l'île CHANGE_SETTINGS: name: Modifier les paramètres description: |- - Autoriser le changement de membre - &un rôle peut modifier les paramètres de l'îlot. + Autoriser quel rôle de membre + peut modifier les paramètres de l'île. MILKING: description: Activer/désactiver la traite des vaches name: Traite - hint: Vaches laitières handicapées + hint: Traite des vaches désactivée MINECART: name: Chariots minecarts - description: Toggle minecart interactions + description: Activer/désactiver les interactions avec les minecarts hint: Interaction Minecart désactivée MONSTER_NATURAL_SPAWN: description: Activer/désactiver l'apparition naturelle des monstres @@ -1517,8 +1520,8 @@ protection: name: Générateurs de monstres MOUNT_INVENTORY: description: |- - &un accès Toggle - pour monter l'inventaire + Activer/désactiver l'accès + à l'inventaire de monture name: Inventaire de monture hint: Inventaire de montage désactivé NAME_TAG: @@ -1528,9 +1531,9 @@ protection: NATURAL_SPAWNING_OUTSIDE_RANGE: name: Apparition de créatures naturelles en dehors de la portée description: |- - Basculez si les créatures (animaux et - et un monstre) peuvent apparaître naturellement à l'extérieur - a plage de protection d'une île. + Bascule si les créatures (animaux et + monstres) peuvent apparaître naturellement en dehors + de la plage de protection d'une île. Notez que cela n'empêche pas les créatures pour se reproduire via un générateur de mob ou un spawn @@ -1561,7 +1564,7 @@ protection: OFFLINE_GROWTH: description: |- Lorsque désactivé, les plantes - ne poussera pas sur les îles + ne pousseront pas sur les îles où tous les membres sont hors ligne. Peut aider à réduire le décalage. name: Croissance Hors Ligne @@ -1575,10 +1578,10 @@ protection: name: Redstone Hors Ligne PETS_STAY_AT_HOME: description: |- - Lorsqu'il est actif, animaux apprivoisés - ne peut aller qu'à et - ne peut pas quitter le propriétaire - &une île natale. + Lorsqu'actif, les animaux apprivoisés + ne peuvent aller que sur + l'île du propriétaire et + ne peuvent pas la quitter. name: Les animaux restent à la maison PISTON_PUSH: description: |- @@ -1598,7 +1601,7 @@ protection: POTION_THROWING: name: Lancer de potions description: |- - actier/désactiver le jet des potions. + Activer/désactiver le jet des potions. Cela inclut les éclaboussures et les potions persistantes. hint: Lancer des potions désactivé NETHER_PORTAL: @@ -1607,7 +1610,7 @@ protection: hint: Utilisation du portail désactivée END_PORTAL: description: Basculer l'utilisation - name: Portail de Fin + name: Portail de l'End hint: Utilisation du portail désactivée PAUSE_MOB_GROWTH: name: Pause croissance des mobs @@ -1653,7 +1656,7 @@ protection: Empêche la sortie de The_End de se générer aux coordonnées 0,0 - name: Remove end exit island + name: Supprimer l'île de sortie de l'End REMOVE_MOBS: description: |- Supprimer des monstres lorsque @@ -1662,7 +1665,7 @@ protection: RIDING: description: Basculer le monture name: Montée d'animaux - hint: Equitation pour animaux handicapés + hint: Monter les animaux désactivé SHEARING: description: Activer/désactiver la tonte name: Tondre @@ -1681,20 +1684,20 @@ protection: autorisé. SCULK_SENSOR: description: |- - Active/désactive le capteur Sculk - &une activation. + Active/désactive l'activation + du capteur Sculk. name: Capteur Sculk hint: l'activation du capteur Sculk est désactivée SCULK_SHRIEKER: description: |- - Active/désactive le crieur de Sculk - &une activation. + Active/désactive l'activation + du crieur de Sculk. name: Hurleur de Sculk hint: l'activation du Sculk Shrieker est désactivée SIGN_EDITING: description: |- Permet l'édition de texte - de signes + des panneaux name: Édition de panneaux hint: l'édition des panneaux est désactivée TNT_DAMAGE: @@ -1723,7 +1726,7 @@ protection: description: |- Activer / désactiver la croissance des arbres en dehors d'une plage de protection d'une île ou non. - Non seulement cela empêchera les jeunes arbres plcés hors de la + Non seulement cela empêchera les jeunes arbres placés hors de la plage de protection d'une île de grandir, mais il va également bloquer la génération de feuilles / bûches en dehors de l'île, donc cela @@ -1749,14 +1752,20 @@ protection: hint: 'Vous ne pouvez pas faire cela en tombant.' VISITOR_KEEP_INVENTORY: name: Les visiteurs gardent l'inventaire au décès - description: "Empêcher les joueurs de perdre leur\nobjets et expérience s'ils meurent\nune île dans laquelle ils sont un visiteur.\n&un\nLes membres de Island perdent toujours leurs objets\ns'ils meurent sur leur propre île\_!" + description: |- + Empêche les joueurs de perdre leurs + objets et leur expérience s'ils meurent + sur une île où ils sont visiteurs. + + Les membres de l'île perdent toujours leurs objets + s'ils meurent sur leur propre île ! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protection du vide sur l'île spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Lorsqu'activé, les joueurs qui tombent + dans le vide sur l'île spawn + seront téléportés au point + de spawn au lieu de mourir. RAID_TRIGGER: name: Déclencheur de raid description: Définit le rang minimum d'île requis pour déclencher un raid @@ -1843,7 +1852,7 @@ protection: définir le nom ban: |- Sélectionnez le rang qui peut - bannir des joueurs + bannir des joueurs unban: |- Sélectionnez le rang qui peut débannir les joueurs @@ -1949,7 +1958,7 @@ management: COMPATIBLE . Ses fonctionnalités sont entièrement conçues pour - course dans cet environnement. + fonctionner dans cet environnement. SUPPORTED: | Tourne sous [name] [version] . @@ -2016,33 +2025,33 @@ catalog: enums: DamageCause: CONTACT: Contact - ENTITY_ATTACK: Attaque de foule + ENTITY_ATTACK: Attaque d'entité ENTITY_SWEEP_ATTACK: Attaque par balayage PROJECTILE: Projectiles SUFFOCATION: Étouffement - FALL: Automne + FALL: Chute FIRE: Feu FIRE_TICK: Brûlant MELTING: Fusion LAVA: Lave DROWNING: Noyade - BLOCK_EXPLOSION: Bloquer l'explosion + BLOCK_EXPLOSION: Explosion de bloc ENTITY_EXPLOSION: Explosion d'entité VOID: Vide LIGHTNING: Foudre SUICIDE: Suicide - STARVATION: famine + STARVATION: Famine POISON: Poison - MAGIC: la magie - WITHER: Flétrir + MAGIC: Magie + WITHER: Wither FALLING_BLOCK: Bloc qui tombe - THORNS: Les épines + THORNS: Épines DRAGON_BREATH: Souffle du dragon - CUSTOM: Coutume + CUSTOM: Personnalisé FLY_INTO_WALL: Voler dans le mur HOT_FLOOR: Plancher chaud CRAMMING: Bourrage - DRYOUT: Déssecher + DRYOUT: Assèchement FREEZE: Gel KILL: Tuer SONIC_BOOM: Boom Sonique From b3da899b79b3bbfde596befd6d21836bc09db240 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:15:34 -0700 Subject: [PATCH 31/95] Fix Italian (it.yml) locale: correct mistranslations, typos, broken tags, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English: maxsize section, SPAWN_PROTECTION flag, DRAGON_EGG description, FIRE_SPREAD description, catalog view descriptions, range description - Fix broken legacy color codes: &-prefixed strings on not-in-team, unowned, use-switch, use-emptytrash replaced with MiniMessage tags - Fix typos: rabngo->rango, opiati->Copiati, alvoro->lavoro, teletrasposrto->teletrasporto, smostra->mostra, Disbilitando->Disabilitando, disablitata->disabilitata, commando->comando, "is non è"->non è - Fix wrong translations: DROWNING Affogare->Annegamento, THORNS Rami->Spine, STARVATION Carestia->Fame, FLY_INTO_WALL Vola->Impatto, FREEZE/KILL to nouns, Commissioni->Commit, Invalido->Non valido, "I animali"->"Gli animali", "sovrascrivi noci"->"sovrascrive i Secchi" Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/it.yml | 88 +++++++++++++++---------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/main/resources/locales/it.yml b/src/main/resources/locales/it.yml index 244fbfb29..e89c44c29 100644 --- a/src/main/resources/locales/it.yml +++ b/src/main/resources/locales/it.yml @@ -12,7 +12,7 @@ prefixes: islands: isole general: success: 'Successo!' - invalid: Invalido + invalid: Non valido beta: 'Questo comando è in beta. Assicurati di avere backup!' errors: command-cancelled: 'Comando annullato.' @@ -29,8 +29,8 @@ general: Non è stato possibile trovare un luogo sicuro per teletrasportarti nell'isola. not-owner: 'Non sei il proprietario della tua isola!' - player-is-not-owner: '[name] is non è il proprietario di nessuna isola!' - not-in-team: '&Quel giocatore non è nel tuo team!' + player-is-not-owner: '[name] non è il proprietario di nessuna isola!' + not-in-team: 'Quel giocatore non è nel tuo team!' offline-player: 'Quel giocatore è offline o non esiste.' unknown-player: '[name] è un giocatore sconosciuto!' general: 'Quel comando non è ancora pronto - contatta un''admin' @@ -52,7 +52,7 @@ commands: end: '=================================' page: 'Pagina [page] di [total]' parameters: '[command]' - description: commando di aiuto + description: comando di aiuto console: Console admin: help: @@ -192,12 +192,12 @@ commands: Attenzione: questo giocatore possiede ora [number] isole. Questo è più di quanto consentito dalle impostazioni o dai permessi: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Imposta la dimensione massima del team per il [prefix_island] di un giocatore (usa 0 per ripristinare il valore predefinito del mondo) + success: 'Impostata la dimensione massima del team di [name] per [prefix_island] a [number].' + reset: 'Ripristinata la dimensione massima del team di [name] per [prefix_island] al valore predefinito del mondo ([number]).' range: - description: Admin island range command + description: Comando admin per il raggio dell'isola invalid-value: too-low: 'Il raggio di protezione deve essere più grande di 1!' too-high: >- @@ -292,7 +292,7 @@ commands: is-spawn: L'isola è un'isola di spawn banned-players: 'Giocatori banditi:' banned-format: '[name]' - unowned: '&Senza proprietario' + unowned: 'Senza proprietario' bundle: 'Pacchetto Blueprint utilizzato per creare l''isola: [name]' switch: description: attiva/disattiva il bypass della protezione @@ -319,10 +319,10 @@ commands: title: '=========== Isole nel Cestino ===========' count: 'Isola [number]:' use-switch: >- - &Usa [label] switchto per scambiare l'isola del - player con quella nel cestino + Usa [label] switchto per scambiare l'isola del + giocatore con quella nel cestino use-emptytrash: >- - &Usa [label] emptytrash [player]per rimuovere permanentemente le + Usa [label] emptytrash [player] per rimuovere permanentemente le isole nel cestino emptytrash: parameters: '[player]' @@ -355,7 +355,7 @@ commands: description: teleporta un giocatore all'[prefix_island] di un altro giocatore getrank: parameters: - description: ottieni il rabngo di un player nella sua isola + description: ottieni il rango di un giocatore nella sua isola rank-is: 'Il rango è [rank] nella sua isola.' setrank: parameters: @@ -416,12 +416,12 @@ commands: impostata! need-pos1-pos2: 'Imposta la posizione 1 e la posizione 2 prima!' copying: 'Copiando i blocchi...' - copied-blocks: 'opiati [number] blocchi nella clipboard' + copied-blocks: 'Copiati [number] blocchi nella clipboard' look-at-a-block: 'Guarda verso un blocco entro 20 blocchi per impostare una posizione' mid-copy: >- Sei in mezzo al processo di copia. Aspetta finchè la copia non è completata. - copied-percent: 'opiati [number]%' + copied-percent: 'Copiati [number]%' copy: parameters: '[air]' description: >- @@ -574,7 +574,7 @@ commands: parameters: description: abilita/disabilita i report di debug di protezione nella console turning-on: Abilitando il debug in console per [name]. - turning-off: Disbilitando il debug in console per [name]. + turning-off: Disabilitando il debug in console per [name]. deaths: description: modifica le morti di un giocatore reset: @@ -730,7 +730,7 @@ commands: description: mostra info riguardo la tua isola o riguardo quella di un giocatore parameters: near: - description: smostra il nome delle isole adiacenti alla tua + description: mostra il nome delle isole adiacenti alla tua parameters: '' the-following-islands: 'Le seguenti isole sono adiacenti:' syntax: '[direction]: [name]' @@ -1247,7 +1247,7 @@ protection: COLLECT_POWDERED_SNOW: description: |- Attiva la raccolta della neve in polvere - (sovrascrivi noci) + (sovrascrive i Secchi) name: Raccogli neve in polvere hint: Secchi di neve in polvere disabilitati COMMAND_RANKS: @@ -1255,7 +1255,7 @@ protection: description: 'Configura i comandi dei ranghi' CRAFTING: description: Abilita/disabilita uso - name: Banchi da alvoro + name: Banchi da lavoro hint: Uso di banchi da lavoro vietato CREEPER_DAMAGE: description: Abilita/disabilita danni dei creeper @@ -1279,10 +1279,10 @@ protection: DRAGON_EGG: name: Uovo di drago description: |- - Prevents interaction with Dragon Eggs. + Impedisce l'interazione con le Uova di Drago. - This does not protect it from being - placed or broken. + Non protegge dal piazzamento + o dalla rottura. hint: No interazioni con uovo di drago DYE: description: Evita l'uso di coloranti @@ -1349,12 +1349,12 @@ protection: FIRE_SPREAD: name: Espansione di fuochi description: |- - Toggle whether fire can spread - to nearby blocks or not. + Scegli se il fuoco può espandersi + ai blocchi vicini oppure no. FISH_SCOOPING: name: Raccolta di pesci description: Permetti la raccolta dei pesci utilizzando un secchio - hint: Raccolta di pesci disablitata + hint: Raccolta di pesci disabilitata FLINT_AND_STEEL: name: Acciarino description: |- @@ -1561,7 +1561,7 @@ protection: possono solo andare e non possono lasciare la casa del proprietario [prefix_island]. - name: I animali domestici restano a casa + name: Gli animali domestici restano a casa PISTON_PUSH: description: |- Attiva questa opzione per evitare che i @@ -1639,7 +1639,7 @@ protection: REMOVE_MOBS: description: |- Rimuovi i mostri durante - il teletrasposrto all'isola + il teletrasporto all'isola name: Rimuovi i mostri RIDING: description: Abilita/disabilita cavalcatura @@ -1735,12 +1735,12 @@ protection: I membri di [prefix_Island] perdono comunque i loro oggetti se muoiono nella propria [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protezione dal vuoto nell'isola spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Quando attivo, i giocatori che cadono + nel vuoto nell'isola spawn + verranno teletrasportati al punto + di spawn invece di morire. RAID_TRIGGER: name: Attivazione incursione description: Imposta il rango minimo dell'isola richiesto per attivare un'incursione @@ -1963,13 +1963,13 @@ catalog: gamemodes: name: 'Modalità di gioco' description: | - Click to browse through the - available official Gamemodes. + Clicca per sfogliare le + Modalità di gioco ufficiali disponibili. addons: name: 'Addons' description: | - Click to browse through the - available official Addons. + Clicca per sfogliare gli + Addons ufficiali disponibili. icon: description-template: | [topic] @@ -2000,26 +2000,26 @@ enums: FIRE_TICK: Bruciando MELTING: Fusione LAVA: 'Lava' - DROWNING: Affogare + DROWNING: Annegamento BLOCK_EXPLOSION: Esplosione di Blocchi ENTITY_EXPLOSION: Esplosione dell'Entità VOID: Vuoto LIGHTNING: Fulmine SUICIDE: Suicidio - STARVATION: Carestia + STARVATION: Fame POISON: Veleno MAGIC: Magia WITHER: Wither FALLING_BLOCK: Blocco Cadente - THORNS: Rami + THORNS: Spine DRAGON_BREATH: Respiro di Drago CUSTOM: Personalizzato - FLY_INTO_WALL: Vola Dentro al Muro + FLY_INTO_WALL: Impatto col Muro HOT_FLOOR: Pavimento Caldo CRAMMING: Cramming DRYOUT: Asciugatura - FREEZE: Congela - KILL: Uccidi + FREEZE: Congelamento + KILL: Uccisione SONIC_BOOM: Boom Sonico WORLD_BORDER: Confine del Mondo panel: @@ -2027,7 +2027,7 @@ panel: title: '[name] Crediti' contributor: name: '[name]' - description: 'Commissioni: [commits]' + description: 'Commit: [commits]' empty-here: name: 'Sembra vuoto qui...' description: >- From 3977d6f90d17b1fefe1254c20b889bd692eee7b7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:16:16 -0700 Subject: [PATCH 32/95] Fix Korean (ko.yml) locale: translate English strings, fix broken codes and typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated maxsize section (parameters, description, success, reset) - Translate SPAWN_PROTECTION flag (name and description) - Fix broken legacy color codes: '& c', '& 7', '& a', '&' replaced with MiniMessage tags - Fix DamageCause mistranslations: FALL 가을->낙하, CONTACT 연락처->접촉, DRYOUT 드라이터->건조, CRAMMING 크래밍->밀착 - Fix LOOM broken tag in name, FLOWER_POT/SUFFOCATION remove English in brackets - Fix TRAPPED_CHEST 감금된->함정, BARREL 통 합->통, GRINDSTONE hint typo - Fix typos: 섬위->섬의, 답승->탑승, 프기->퍼기, 플수->퍼올 수, 흭득->획득 - Remove leftover English 'or' in emptytrash description - Fix NATURAL_SPAWNING_OUTSIDE_RANGE and PREVENT_TELEPORT_WHEN_FALLING broken '&' color code lines with proper MiniMessage tags - Fix reload warning broken '& c' color code Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ko.yml | 78 +++++++++++++++---------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/main/resources/locales/ko.yml b/src/main/resources/locales/ko.yml index e12b1ed95..5b492e2b5 100644 --- a/src/main/resources/locales/ko.yml +++ b/src/main/resources/locales/ko.yml @@ -16,9 +16,9 @@ general: invalid: 올바르지 않음 beta: '이 명령은 베타입니다. 백업이 있는지 확인하십시오!' errors: - command-cancelled: '& c 명령이 취소되었습니다.' + command-cancelled: '명령이 취소되었습니다.' no-permission: ' 당신은 이 명령어를 실행하기 위한 권한을 가지고있지 않습니다. 필요 권한 : ([permission]).' - insufficient-rank: '& c 당신의 랭크는 그렇게하기에 충분히 높지 않습니다! (& 7 [rank] & c)' + insufficient-rank: '당신의 랭크는 그렇게하기에 충분히 높지 않습니다! ([rank])' use-in-game: '이 명령어는 인게임에서만 사용할 수 있습니다.' use-in-console: '이 명령은 콘솔에서만 사용할 수 있습니다.' no-team: '당신은 다른 사람의 섬에 소속되어있지 않습니다!' @@ -175,10 +175,10 @@ commands: 경고: 이 플레이어는 현재 [number] 개의 섬을 소유하고 있습니다. 이는 설정이나 권한으로 허용된 수 [max]를 초과했습니다. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: <플레이어> <크기> + description: 플레이어의 [prefix_island] 최대 팀 크기를 설정합니다 (0으로 월드 기본값으로 초기화) + success: '[name]의 [prefix_island] 최대 팀 크기를 [number]로 설정했습니다.' + reset: '[name]의 [prefix_island] 최대 팀 크기를 월드 기본값([number])으로 초기화했습니다.' range: description: 어드민 섬 범위 명령어 invalid-value: @@ -198,7 +198,7 @@ commands: set: parameters: <플레이어> <범위> description: 섬 보호범위를 설정합니다 - success: '섬위 보호범위를 [number]로 설정하였습니다.' + success: '섬의 보호범위를 [number]로 설정하였습니다.' reset: parameters: <플레이어> description: 보호범위를 기본으로 되돌립니다 @@ -290,7 +290,7 @@ commands: use-emptytrash: '[label] emptytrash [player]를 사용하여 쓰레기통의 섬들을 삭제합니다' emptytrash: parameters: '[player]' - description: 쓰레기통에 있는 섬을 청소하거나, or 쓰레기통에 있는 모든 주인없는 섬을 청소합니다 + description: 쓰레기통에 있는 섬을 청소하거나, 쓰레기통에 있는 모든 주인없는 섬을 청소합니다 success: '쓰레기통을 비웠습니다' version: description: BentoBox와 애드온들의 버전을 보여줍니다 @@ -551,8 +551,8 @@ commands: addon: '[prefix_bentobox] [name]을(를) 리로드 하는 중입니다 .' addon-reloaded: '[prefix_bentobox][name] 이(가) 리로드되었습니다' warning: >- - [prefix_bentobox] & c 경고 : 리로드하면 불안정 해질수 있으므로 나중에 오류가 발생하면 서버를 다시 - 시작하십시오. + [prefix_bentobox] 경고: 리로드하면 불안정 해질수 있으므로 나중에 오류가 발생하면 서버를 다시 + 시작하십시오. unknown-addon: '[prefix_bentobox]알수없는 애드온 입니다!' locales: description: 번역 리로드 @@ -1046,7 +1046,7 @@ protection: (트랩 상자는 포함되지 않음) hint: '상자 접근이 비활성화되었습니다' BARREL: - name: 통 합 + name: 통 description: 배럴 상호작용 전환 hint: 배럴 접근 비활성화됨 CRAFTER: @@ -1064,17 +1064,17 @@ protection: description: 컴포스터 상호작용 전환 hint: 퇴비통 상호작용 비활성화됨 LOOM: - name: '룸[]' + name: 베틀 description: 사용 전환 - hint: 루미 접속 비활성화됨 + hint: 베틀 접근이 비활성화됨 FLOWER_POT: - name: 꽃 화분 [Flower pots] + name: 꽃 화분 description: 꽃 화분 상호작용 전환 hint: 꽃 화분 상호작용 비활성화됨 GRINDSTONE: name: 연마석 description: 사용 전환 - hint: 전환석 접근이 비활성화되었습니다 + hint: 연마석 접근이 비활성화되었습니다 SHULKER_BOX: name: 술커 박스 description: 셔커 박스 상호작용 전환하기 @@ -1093,7 +1093,7 @@ protection: description: 사용 전환 hint: 석재 절단 접근이 비활성화되었습니다. TRAPPED_CHEST: - name: 감금된 상자들 + name: 함정 상자 description: 잠긴 보물 상자 상호작용 전환 hint: 트랩된 상자 접근 비활성화됨 DISPENSER: @@ -1131,16 +1131,16 @@ protection: hint: 거친 흙 경작이 금지되어 있습니다 COLLECT_LAVA: description: |- - 용암을 플수 있는지 여부설정 + 용암을 퍼올 수 있는지 여부설정 양동이 사용 설정을 덮어씁니다 - name: 용암 프기 - hint: 용암을 플수 없습니다 + name: 용암 퍼기 + hint: 용암을 퍼올 수 없습니다 COLLECT_WATER: description: |- - 물을 플수 있는지 여부설정 + 물을 퍼올 수 있는지 여부설정 양동이 사용 설정을 덮어씁니다 - name: 물 프기 - hint: 물을 플수 없습니다 + name: 물 퍼기 + hint: 물을 퍼올 수 없습니다 COLLECT_POWDERED_SNOW: description: |- 분말 눈 수집 전환 @@ -1400,7 +1400,7 @@ protection: description: |- 생물 (동물과 몬스터) 자연스럽게 외부에서 스폰 할 수 있습니다 - & 섬의 보호 범위밖에 + 섬의 보호 범위밖에 생물을 방해하지는 않습니다. 몹 스폰 또는 계란을 통해 스폰 @@ -1409,7 +1409,7 @@ protection: name: 소리블록 hint: 소리블록 상호작용이 금지되어있습니다 OBSIDIAN_SCOOPING: - name: 흑요석 프기 + name: 흑요석 퍼기 description: |- 플레이어가 흑요석을 퍼 내도록 허용 용암으로 다시 빈 양동이와 함께. @@ -1524,7 +1524,7 @@ protection: name: 몬스터를 없앰 RIDING: description: 탑승 가능 여부 - name: 동물 답승 + name: 동물 탑승 hint: 동물 탑승이 허용되어있지 않습니다 SHEARING: description: 양털 깎기 가능여부 설정 @@ -1591,15 +1591,15 @@ protection: name: 차가운 걸음 hint: 차가운 걸음 인첸트를 사용할수 없습니다 EXPERIENCE_PICKUP: - name: 경험치 흭득 - description: 경험치를 흭득할수 있는지 설정합니다 - hint: 경험치를 흭득할수 없습니다 + name: 경험치 획득 + description: 경험치를 획득할수 있는지 설정합니다 + hint: 경험치를 획득할수 없습니다 PREVENT_TELEPORT_WHEN_FALLING: name: 떨어질때 tp를 할수 없게 합니다 description: |- 플레이어가 떨어질때 명령어를 사용하여 섬을 갈수 - & a 없게 합니다 + 없게 합니다 hint: '떨어지고 있을땐 그것을 할수 없습니다' VISITOR_KEEP_INVENTORY: name: 방문자는 죽었을 때 인벤토리를 유지합니다. @@ -1609,12 +1609,12 @@ protection: [prefix_Island] 멤버는 자신의 [prefix_island]에서 죽으면 여전히 아이템을 잃습니다! SPAWN_PROTECTION: - name: Spawn island void protection + name: 스폰 섬 공허 보호 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 활성화되면, 스폰 섬에서 + 공허로 떨어지는 플레이어는 + 죽는 대신 스폰 지점으로 + 텔레포트됩니다. RAID_TRIGGER: name: 레이드 트리거 description: 레이드를 시작하는 데 필요한 최소 섬 등급을 설정합니다 @@ -1854,12 +1854,12 @@ catalog: BentoBox가 구성에서 GitHub에 연결하도록 허용하거나 나중에 다시 시도하십시오. enums: DamageCause: - CONTACT: 연락처 + CONTACT: 접촉 ENTITY_ATTACK: 몹 공격 ENTITY_SWEEP_ATTACK: 스윕 공격 PROJECTILE: 발사체 - SUFFOCATION: 질식 [Suffocation] - FALL: 가을 + SUFFOCATION: 질식 + FALL: 낙하 FIRE: 불 FIRE_TICK: 불타는 MELTING: 녹기 @@ -1880,8 +1880,8 @@ enums: CUSTOM: 커스텀 FLY_INTO_WALL: 벽으로 날기 HOT_FLOOR: 뜨거운 바닥 - CRAMMING: 크래밍 - DRYOUT: 드라이터 + CRAMMING: 밀착 + DRYOUT: 건조 FREEZE: 동결 KILL: 죽이기 SONIC_BOOM: 소닉 붐 From 1f7b4a63fe81c8e7941d8195333ac07d461fa192 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:17:01 -0700 Subject: [PATCH 33/95] Fix Hungarian (hu.yml) locale: translate untranslated strings and fix mistranslations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English in maxsize and SPAWN_PROTECTION sections - Fix "Hollandia" (Netherlands) -> "Pokol" (Nether) for Minecraft Nether - Fix "lejátszó" (media player) -> "játékos" (player) throughout - Fix "ivadék/ívás" (offspring/fish spawning) -> "spawn/megjelenés" for mob spawning - Fix "mellkas" (body chest) -> "láda" (chest container) for chest blocks - Fix "Kúszónövény" (climbing plant) -> "Creeper" for Minecraft Creeper - Fix "gyász" (mourning) -> "rombolás" (griefing) for grief protection - Fix "csőcselék" (rabble) -> "mob" for entities - Fix "Fáklyák" (Torches) -> "Jeladók" for Beacons - Fix "Nem reklámozhatod" (can't advertise) -> "Nem léptetheted elő" (can't promote) - Fix DamageCause values: FALL, VOID, MELTING, CONTACT, WITHER - Fix unban messages that incorrectly said "banned" instead of "unbanned" - Fix setowner success "nem" (not) -> "most" (now) the owner - Fix "Overworl" typo -> "Overworld" - Fix broken &védelem legacy color code in Creeper griefing - Fix "fogyatékos/mozgáskorlátozott" (handicapped) -> "letiltva" (disabled) - Fix various item/entity terminology (Elem->Tárgy, Tétel->Tárgy) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/hu.yml | 222 +++++++++++++++--------------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/src/main/resources/locales/hu.yml b/src/main/resources/locales/hu.yml index 2ae16172c..6883d499a 100644 --- a/src/main/resources/locales/hu.yml +++ b/src/main/resources/locales/hu.yml @@ -77,7 +77,7 @@ commands: parameters: [[prefix_island] név] cleared: 'Otthon visszaállítva. [name]' resets: - description: szerkesztheti a lejátszó visszaállítási értékeit + description: szerkesztheti a játékos visszaállítási értékeit set: description: beállítja, hogy ez a játékos hányszor állította vissza a szigetét parameters: @@ -193,15 +193,15 @@ commands: confirmation: >- Biztos vagy benne, hogy a [name]-t akarod kijelölni a [prefix_island] tulajdonosának a [xyz]-nél? - success: '[name]nem a [prefix_island] tulajdonosa.' + success: '[name] most a [prefix_island] tulajdonosa.' extra-islands: >- Figyelmeztetés: ez a játékos most [number] szigettel rendelkezik. Ez több, mint amit a beállítások vagy jogosultságok engednek: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Állítsa be a maximális csapatméretet egy játékos [prefix_island]-jára (0 a világ alapértelmezésre állításhoz) + success: 'Beállítva [name] [prefix_island] maximális csapatmérete: [number].' + reset: 'Visszaállítva [name] [prefix_island] maximális csapatmérete a világ alapértelmezésre ([number]).' range: description: Admin [prefix_island] tartományának parancsa invalid-value: @@ -229,25 +229,25 @@ commands: description: Beállítja a [prefix_island] védelmi tartományát success: 'A [prefix_island] védelmi tartományának beállítása [number]-ra/re.' reset: - parameters: + parameters: description: >- visszaállítja a [prefix_island] védett tartományát a világ alapértelmezett értékére success: 'Szigetvédelmi tartomány visszaállítása erre: [number].' add: description: növeli a [prefix_island] védett tartományát - parameters: + parameters: success: >- Sikeresen megnöveltük [name][prefix_island] védett tartományát [total] -re (+[number]). remove: description: csökkenti a [prefix_island] védett tartományát - parameters: + parameters: success: >- Sikeresen csökkentette [name][prefix_island] védett tartományát [total] -re (-[number]). register: - parameters: + parameters: description: regisztrálj játékost egy ismeretlen szigetre, amelyen tartózkodsz registered-island: '[name] regisztrálva a [xyz] szigetre.' reserved-island: 'fenntartott [prefix_island] a [xyz] címen a [name] számára.' @@ -273,7 +273,7 @@ commands: A játékosnak több [prefix_island] van. Kérlek, jelöld meg, melyiket. info: - parameters: + parameters: description: információkat kaphat a tartózkodási helyéről vagy a játékos szigetéről no-island: 'Jelenleg nem vagy szigeten...' title: '========== [prefix_Island] információ ============' @@ -313,7 +313,7 @@ commands: removing: 'Védelem megkerülésének eltávolítása...' adding: 'Védelem bypass hozzáadása...' switchto: - parameters: + parameters: description: váltsd át a játékos szigetét a kukában lévő számozottra out-of-range: >- A számnak 1 és [number] között kell lennie. A szigetszámok @@ -330,10 +330,10 @@ commands: title: '=========== [prefix_Island]ek a kukában ===========' count: 'Island [number]:' use-switch: >- - Használja az [label] kapcsolót a gombbal a - lejátszót a kukában lévő szigetre válthatja + Használja az [label] kapcsolót a gombbal a + játékost a kukában lévő szigetre válthatja use-emptytrash: >- - Az [label] ürestrash [lejátszó]használatával véglegesen + Az [label] ürestrash [játékos]használatával véglegesen eltávolíthatja a kukát emptytrash: parameters: '[játékos]' @@ -344,7 +344,7 @@ commands: version: description: megjeleníti a BentoBox és a kiegészítők verzióit setrange: - parameters: + parameters: description: állítsa be a játékos szigetének hatótávolságát range-updated: 'Szigettartomány frissítve a következőre: [number].' placeholders: @@ -356,7 +356,7 @@ commands: reload: description: újratölteni tp: - parameters: [teleportálandó lejátszó] + parameters: [teleportálandó játékos] description: teleportálni egy játékos szigetére manual: >- Nem található biztonságos vetemedés! Manuálisan lépjen a @@ -395,15 +395,15 @@ commands: description: állíts be egy szigetet spawnként ehhez a játékmódhoz already-spawn: 'Ez a [prefix_island] már spawn!' no-island-here: 'Itt nincs [prefix_island].' - confirmation: 'Biztos, hogy ezt a szigetet kívánja beállítani a világ ivadékává?' - success: 'Sikeresen beállította ezt a szigetet a világ ivadékává.' + confirmation: 'Biztos, hogy ezt a szigetet kívánja beállítani spawn szigetként?' + success: 'Sikeresen beállította ezt a szigetet spawn szigetként.' setspawnpoint: - description: állítsa be az aktuális helyet a [prefix_island] ívási pontjaként + description: állítsa be az aktuális helyet a [prefix_island] spawn pontjaként no-island-here: 'Itt nincs [prefix_island].' confirmation: >- - Biztos benne, hogy ezt a helyet szeretné beállítani a [prefix_island] ívási + Biztos benne, hogy ezt a helyet szeretné beállítani a [prefix_island] spawn pontjaként? - success: 'Sikeresen beállította ezt a helyet a [prefix_island] ívási pontjaként.' + success: 'Sikeresen beállította ezt a helyet a [prefix_island] spawn pontjaként.' island-spawnpoint-changed: '[user] megváltoztatta a [prefix_island] spawn pontot.' settings: parameters: '[player]/[world flag]/spawn-island [flag/active/disable] [rank/active/disable]' @@ -567,16 +567,16 @@ commands: world: description: Világbeállítások kezelése delete: - parameters: + parameters: description: törli a játékos szigetét cannot-delete-owner: 'A [prefix_island] összes tagját ki kell rúgni a szigetről, mielőtt törli.' deleted-island: '[prefix_island] itt: [xyz] sikeresen törölve.' deletehomes: - parameters: + parameters: description: törli az összes elnevezett otthont egy szigetről warning: 'Az összes megnevezett otthon törlésre kerül a szigetről!' why: - parameters: + parameters: description: konzolvédelem hibakeresési jelentések váltása turning-on: 'Konzolhibakeresés bekapcsolása [name] számára.' turning-off: 'A konzolhibakeresés kikapcsolása [name] esetén.' @@ -584,7 +584,7 @@ commands: description: Szerkessze a játékosok halálát reset: description: visszaállítja a játékos halálát - parameters: + parameters: success: 'Sikeresen visszaállította [name]halálát 0értékre.' set: description: beállítja a játékos halálát @@ -735,7 +735,7 @@ commands: description: sorolja fel otthonait info: description: információk megjelenítése a szigetről vagy a játékos szigetéről - parameters: + parameters: near: description: mutasd meg a körülötted lévő szomszédos [prefix_islands] nevét parameters: '' @@ -773,8 +773,8 @@ commands: home-list-syntax: '[name]' click-to-teleport: 'Kattints a teleportáláshoz!' nether: - not-allowed: 'Nem állíthatja be otthonát a Hollandiában.' - confirmation: 'Biztos, hogy Hollandiába szeretné helyezni otthonát?' + not-allowed: 'Nem állíthatja be otthonát a Pokolban.' + confirmation: 'Biztos, hogy a Pokolba szeretné helyezni otthonát?' the-end: not-allowed: 'Nem állíthatja be otthonát a végén.' confirmation: 'Biztos benne, hogy a végére akarja állítani az otthonát?' @@ -851,7 +851,7 @@ commands: generic: '[rank] ([number]):' coop: description: alakíts ki játékosszövetségi rangot a szigeteden - parameters: + parameters: cannot-coop-yourself: 'Nem tudod összefogni magad!' already-has-rank: 'A játékosnak már van rangja!' you-are-a-coop-member: 'Önt [name]segítette.' @@ -861,10 +861,10 @@ commands: tagjává. uncoop: description: távolítsa el a coop rangot a játékosból - parameters: + parameters: cannot-uncoop-yourself: 'Nem tudod kiszabadítani magad!' cannot-uncoop-member: 'A csapattagokat nem lehet kibontani!' - player-not-cooped: 'A lejátszó nincs összefogva!' + player-not-cooped: 'A játékos nincs kooperálva!' you-are-no-longer-a-coop-member: 'Ön már nem tagja [name] szigetének.' all-members-logged-off: >- A [prefix_island] összes tagja kijelentkezett, így Ön többé nem tagja [name] @@ -873,7 +873,7 @@ commands: is-full: 'Nem tud együttműködni senki mással.' trust: description: adj egy játékosnak megbízható rangot a szigeteden - parameters: + parameters: trust-in-yourself: 'Bízz magadban!' name-has-invited-you: >- [name] meghívott téged, hogy csatlakozz a szigetük megbízható @@ -884,7 +884,7 @@ commands: is-full: 'Nem bízhatsz másban. Vigyázz magadra!' untrust: description: távolítsa el a megbízható játékos rangját a játékosból - parameters: + parameters: cannot-untrust-yourself: 'Nem bízhatsz magadban!' cannot-untrust-member: 'Nem bízhatsz meg egy csapattagban!' player-not-trusted: 'Az Player nem megbízható!' @@ -932,7 +932,7 @@ commands: already-on-team: 'Az a játékos már tagja a csapatnak!' invalid-invite: 'Ez a meghívó már nem érvényes, sajnálom.' you-have-already-invited: 'Már meghívtad azt a játékost!' - parameters: + parameters: you-can-invite: 'Meghívhat [number] további játékost.' accept: description: fogadja el a meghívást @@ -958,14 +958,14 @@ commands: success: 'Elhagytad ezt a szigetet.' kick: description: távolíts el egy tagot a szigetedről - parameters: + parameters: player-kicked: 'A [name] kirúgott a szigetről [gamemode]-ban!' - cannot-kick: 'Nem rúghatod meg magad!' + cannot-kick: 'Nem rúghatod ki magad!' cannot-kick-rank: 'A rangod nem teszi lehetővé [name] rúgását!' success: '[name] -t kirúgták a szigetedről.' demote: description: lefokozz egy játékost a szigeteden egy ranggal lejjebb - parameters: + parameters: errors: cant-demote-yourself: 'Nem lefokozhatod magad!' cant-demote: 'Magasabb rangokat nem lehet lefokozni!' @@ -974,9 +974,9 @@ commands: success: '[name] lefokozva [rank]' promote: description: előléptessen egy játékost a szigeten egy rangot feljebb - parameters: + parameters: errors: - cant-promote-yourself: 'Nem reklámozhatod magad!' + cant-promote-yourself: 'Nem léptetheted elő magad!' cant-promote: 'Nem léphetsz a rangod fölé!' must-be-member: 'A játékosnak [prefix_an-island] tagnak kell lennie!' failure: 'A játékos nem léptethető tovább!' @@ -991,14 +991,14 @@ commands: target-is-not-member: 'Az a játékos nem tagja a szigeti csapatodnak!' at-max: 'Ennek a játékosnak már van a megengedett maximális számú szigete!' name-is-the-owner: '[name] mostantól a [prefix_island] tulajdonosa!' - parameters: + parameters: you-are-the-owner: 'Mostantól Ön a [prefix_island] tulajdonosa!' ban: description: kitilts egy játékost a szigetedről - parameters: + parameters: cannot-ban-yourself: 'Nem tilthatod ki magad!' cannot-ban: 'Ezt a játékost nem lehet kitiltani.' - cannot-ban-member: 'Először rúgd meg a csapattagot, majd tiltsd ki.' + cannot-ban-member: 'Először rúgd ki a csapattagot, majd tiltsd ki.' cannot-ban-more-players: >- Elérted a kitiltási határt, nem tilthatsz ki több játékost a szigetedről. @@ -1008,11 +1008,11 @@ commands: you-are-banned: 'Ki vagy tiltva erről a szigetről!' unban: description: tiltson le egy játékost a szigetéről - parameters: + parameters: cannot-unban-yourself: 'Nem oldhatod fel magad!' player-not-banned: 'Player nincs kitiltva.' - player-unbanned: '[name]ki van tiltva a szigetedről.' - you-are-unbanned: '[name]kitiltotta a szigetükről!' + player-unbanned: '[name] kitiltása feloldva a szigetedről.' + you-are-unbanned: '[name] feloldotta a kitiltásodat a szigetükről!' banlist: description: listás eltiltott játékosok noone: 'Senki sincs kitiltva ezen a szigeten.' @@ -1028,7 +1028,7 @@ commands: already-selected: 'Már használja ezt a nyelvet.' expel: description: űzz ki egy játékost a szigetedről - parameters: + parameters: cannot-expel-yourself: 'Nem utasíthatod ki magad!' cannot-expel: 'Ezt a játékost nem lehet kizárni.' cannot-expel-member: 'Csapattagot nem zárhatsz ki!' @@ -1058,18 +1058,18 @@ protection: description: Engedélyezze az Allay és Copper Golem számára tárgyak átadását és elvitelét hint: Allay és Copper Golem interakció letiltva ANIMAL_NATURAL_SPAWN: - description: Természetes állati ívás átváltása - name: Állati természetes ívás + description: Természetes állat megjelenés váltása + name: Állatok természetes megjelenése ANIMAL_SPAWNERS_SPAWN: - description: Állatok ívásának átkapcsolása ívókkal - name: Állati ívók + description: Állatok megjelenésének átkapcsolása spawnerekkel + name: Állat spawnerek ANVIL: description: Interakció váltása name: Üllők hint: Üllőhasználat letiltva ARMOR_STAND: description: Interakció váltása - name: Páncél áll + name: Páncélállvány hint: Páncélállvány használat letiltva AXOLOTL_SCOOPING: name: Axolotl kiemelése @@ -1077,8 +1077,8 @@ protection: hint: Az Axolotl kaparászása le van tiltva BEACON: description: Interakció váltása - name: Fáklyák - hint: Beacon használat letiltva + name: Jeladók + hint: Jeladó használat letiltva BELL_RINGING: description: Kapcsolja be a kölcsönhatást name: Engedélyezd a harang zúgását @@ -1162,7 +1162,7 @@ protection: A ládákkal való interakció váltása és láda aknakocsik. (nem tartalmazza a beszorult ládákat) - hint: A mellkasi hozzáférés letiltva + hint: A láda hozzáférés letiltva BARREL: name: Hordók description: A hordó interakciójának váltása @@ -1211,9 +1211,9 @@ protection: description: Használat váltása hint: Kővágás hozzáférés letiltva TRAPPED_CHEST: - name: Csapdába esett ládák - description: Csapdába esett mellkas interakció váltása - hint: A beszorult mellkashoz való hozzáférés letiltva + name: Csapdás ládák + description: Csapdás láda interakció váltása + hint: A csapdás láda hozzáférés letiltva DISPENSER: name: Adagolók description: Az adagoló interakciójának váltása @@ -1231,8 +1231,8 @@ protection: description: Kapcsolja be a garat interakcióját hint: A garat interakciója letiltva CHEST_DAMAGE: - description: Kapcsolja be a robbanás okozta mellkasi sérülést - name: Mellkasi sérülés + description: Kapcsolja be a robbanás okozta ládasérülést + name: Ládasérülés CHORUS_FRUIT: description: Teleportáció váltása name: Kórus gyümölcsei @@ -1242,7 +1242,7 @@ protection: Bármelyik tisztítás engedélyezése szuperlapos darabok bekerülnek szigetvilágok - name: Tiszta szuper lakás + name: Szuperlapos terep tisztítás COARSE_DIRT_TILLING: description: |- A durva művelés váltása @@ -1276,17 +1276,17 @@ protection: name: Munkapadok hint: A munkaasztalhoz való hozzáférés letiltva CREEPER_DAMAGE: - description: | - Toggle kúszónövény - & sérülés elleni védelem - name: Kúszónövény sérülés elleni védelem + description: |- + Creeper sebzés elleni + védelem váltása + name: Creeper sebzés elleni védelem CREEPER_GRIEFING: - description: | - Kúszónövény gyászának váltása - &védelem gyújtáskor + description: |- + Creeper rombolás elleni + védelem váltása szigetlátogató által. - name: Kúszónövény gyászvédelem - hint: Kúszónövény bánat letiltva + name: Creeper rombolás elleni védelem + hint: Creeper rombolás letiltva CROP_PLANTING: description: 'Készlet, aki tud magokat ültetni.' name: Növényültetés @@ -1333,7 +1333,7 @@ protection: description: |- Endermen eltávolíthatja háztömbnyire a szigetektől - name: Enderman gyászol + name: Enderman rombolás ENDERMAN_TELEPORT: description: |- Endermenek tudnak teleportálni @@ -1375,9 +1375,9 @@ protection: Kapcsolja be, hogy a tűz továbbterjedhet-e a közeli blokkokra vagy sem. FISH_SCOOPING: - name: Horgászás - description: Engedje meg a halak kanalazását egy vödör segítségével - hint: A halkaparás letiltva + name: Hal befogás vödörrel + description: Engedje meg a halak vödörrel való befogását + hint: Hal befogás vödörrel letiltva FLINT_AND_STEEL: name: kovakő és acél description: |- @@ -1395,7 +1395,7 @@ protection: hint: Kapuhasználat letiltva GEO_LIMIT_MOBS: description: |- - Távolítsa el a menő csőcseléket + Távolítsa el a mobokat kívülről védett szigettér name: 'Korlátozza a mobokat a szigetre' @@ -1420,26 +1420,26 @@ protection: HURT_ANIMALS: description: Fájdalom váltása name: Bántott állatok - hint: Állatsérülés fogyatékos + hint: Állatsebzés letiltva HURT_MONSTERS: description: Fájdalom váltása name: Bánt szörnyek - hint: Szörnyeteg bántó mozgáskorlátozott + hint: Szörny sebzés letiltva HURT_VILLAGERS: description: Fájdalom váltása name: Bántotta a falusiakat - hint: Falusi lakos sérült + hint: Falusi sebzés letiltva ITEM_FRAME: - name: Elem keret + name: Tárgykeret description: |- Interakció váltása. Felülbírálja a hely- vagy törésblokkokat - hint: Elem Kerethasználat letiltva + hint: Tárgykeret használat letiltva ITEM_FRAME_DAMAGE: description: |- - A csőcselék kárt okozhat - elemkeretek - name: Tétel Keret sérülés + A mobok kárt okozhatnak + tárgykeretekben + name: Tárgykeret sérülés INVINCIBLE_VISITORS: description: |- Legyőzhetetlen látogató konfigurálása @@ -1453,12 +1453,12 @@ protection: name: '[prefix_Island] újraszületése' ITEM_DROP: description: Ledobás váltása - name: Elemesés - hint: Az elem eldobása letiltva + name: Tárgy eldobás + hint: A tárgy eldobása letiltva ITEM_PICKUP: description: Felvétel váltása - name: Tétel átvétel - hint: Elemfelvétel letiltva + name: Tárgy felvétel + hint: Tárgy felvétel letiltva JUKEBOX: description: Használat váltása name: Jukebox használat @@ -1488,9 +1488,9 @@ protection: LIMIT_MOBS: description: |- Entitások korlátozása innen - ívás ebben a játékban + megjelenés ebben a játékban mód. - name: 'Entitástípus spawning korlátozása' + name: 'Entitástípus megjelenés korlátozása' can: 'Lehet spawn' cannot: 'Nem lehet spawn' LIQUIDS_FLOWING_OUT: @@ -1526,19 +1526,19 @@ protection: MILKING: description: Tehénfejés váltása name: Fejés - hint: Fejőtehén fogyatékos + hint: Fejés letiltva MINECART: - name: Minecars + name: Bányakocsik description: |- Váltó elhelyezés, törés és beszállás az aknakocsikba. hint: A Minecart interakció letiltva MONSTER_NATURAL_SPAWN: - description: Kapcsolja be a természetes szörnyek ívását + description: Kapcsolja be a természetes szörny megjelenést name: Szörny természetes spawn MONSTER_SPAWNERS_SPAWN: - description: Váltsd át a szörnyszedést a spawnerekkel - name: Szörnyek ívói + description: Váltsd át a szörny megjelenést spawnerekkel + name: Szörny spawnerek MOUNT_INVENTORY: description: |- Kapcsolja be a hozzáférést @@ -1654,16 +1654,16 @@ protection: PVP_NETHER: description: |- PVP engedélyezése/letiltása - a Hollandiában. - name: Nem PVP - hint: A PVP letiltva a Hollandiában + a Pokolban. + name: Pokol PVP + hint: A PVP letiltva a Pokolban enabled: 'A PVP a Netherben engedélyezve van.' disabled: 'A PVP in the Nether le van tiltva.' PVP_OVERWORLD: description: |- PVP engedélyezése/letiltása a szigeten. - name: Overworl PVP + name: Overworld PVP hint: 'PVP letiltva a Overworldben' enabled: 'A Overworld PVP-je engedélyezve van.' disabled: 'A PVP a Overworldben le van tiltva.' @@ -1780,12 +1780,12 @@ protection: [prefix_Island] tagjai továbbra is elveszítik tárgyaikat ha a saját szigetükön halnak meg! SPAWN_PROTECTION: - name: Spawn island void protection + name: Spawn sziget üresség elleni védelem description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Ha engedélyezve van, a játékosok, akik + beleesnek az ürességbe a spawn szigeten, + visszakerülnek a spawn pontra + ahelyett, hogy meghalnának. RAID_TRIGGER: name: Rajtaütés indítása description: Beállítja a rajtaütés indításához szükséges minimális szigetrangot @@ -1804,10 +1804,10 @@ protection: használhatnak széltölteteket ezen a szigeten. hint: Széltöltet használata letiltva WITHER_DAMAGE: - name: Kapcsolja be a fonáskárosodást + name: Wither sebzés description: |- - Ha aktív, a mar képes - sebzés blokkok és játékosok + Ha aktív, a Wither képes + blokkokat és játékosokat sebezni WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Bed & Respawn horgonyok engedélyezése @@ -2061,26 +2061,26 @@ catalog: a konfigurációt, vagy próbálja újra később. enums: DamageCause: - CONTACT: Kapcsolatba lépni + CONTACT: Érintkezés ENTITY_ATTACK: Mob Támadás ENTITY_SWEEP_ATTACK: Söprő Támadás PROJECTILE: Lövedék SUFFOCATION: Fulladás - FALL: Esik + FALL: Esés FIRE: Tűz FIRE_TICK: Égő - MELTING: Olvasztó + MELTING: Olvadás LAVA: Láva DROWNING: Fulladás BLOCK_EXPLOSION: Blokk robbanás ENTITY_EXPLOSION: Entitás robbanás - VOID: Üres + VOID: Üresség LIGHTNING: Villám SUICIDE: Öngyilkosság STARVATION: Éhezés POISON: Méreg MAGIC: varázslat - WITHER: Elhervad + WITHER: Wither FALLING_BLOCK: Leeső blokk THORNS: Tövis DRAGON_BREATH: Sárkánylehellet From 5ce920ef64c4f4c8f1f3dd5bd2eed2a80605fe3f Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:17:49 -0700 Subject: [PATCH 34/95] Fix Japanese (ja.yml) locale: translate untranslated strings, fix mistranslations, broken tags, and placeholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English in maxsize section and SPAWN_PROTECTION flag - Fix broken legacy color codes (&ア, &ピ) in FLINT_AND_STEEL and HARVEST descriptions - Fix translated placeholders ([番号],[名前],[合計]) back to English ([number],[name],[total]) - Fix mistranslations: 成否->成功 (success), 生協->協力者 (coop rank), 産卵->スポーン (spawn), 無効->奈落 (VOID DamageCause), 一夜漬け->押し潰し (CRAMMING), 世界国境->ワールドボーダー, 衝突->接触ダメージ (CONTACT), 終わり->ジ・エンド (the-end), ウーバーイーツ->ウーパールーパー - Fix WITHER_DAMAGE name from generic 許可/禁止 to ウィザーダメージの切り替え - Fix Copper Golem left untranslated in ALLAY flag - Fix CRAFTER hint left in English - Translate reset-to-default panel name - Fix missing tags on OFFLINE_REDSTONE, VISITOR_KEEP_INVENTORY, ENTITY_PORTAL_TELEPORT - Fix 所有->未所有 (unowned), stray space in 訪問 者, various 協同組合/生協 references - Fix ITEM_FRAME description with missing tag and untranslated Toggle Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ja.yml | 132 +++++++++++++++--------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/main/resources/locales/ja.yml b/src/main/resources/locales/ja.yml index dd0921984..afaa3a039 100644 --- a/src/main/resources/locales/ja.yml +++ b/src/main/resources/locales/ja.yml @@ -11,7 +11,7 @@ prefixes: an-island: 島 islands: 島 general: - success: '成否' + success: '成功!' invalid: 無効 beta: 'このコマンドはベータ版です。バックアップがあることを確認してください!' errors: @@ -41,7 +41,7 @@ general: worlds: overworld: オーバーワールド nether: ネザー - the-end: 終わり + the-end: ジ・エンド commands: help: header: '=========== [label]の ヘルプ ===========' @@ -79,11 +79,11 @@ commands: add: description: このプレイヤーの島リセット数を追加します parameters: <プレーヤー> <リセット> - success: '[number]resetsを[name]に追加し、合計を[total]resetsに増やしました。' + success: '[number]回のリセットを[name]に追加し、合計を[total]回に増やしました。' remove: description: プレイヤーの島のリセット回数を減らします parameters: <プレーヤー> <リセット> - success: '[番号] リセットが [名前] の島から正常に削除され、合計が [合計]リセットに減少しました。' + success: '[number] リセットが [name] の島から正常に削除され、合計が [total]リセットに減少しました。' purge: parameters: '[日]' description: '[日]以上放棄された島をパージする' @@ -139,7 +139,7 @@ commands: fix: description: データベース内のクロスアイランドメンバーシップをスキャンして修正 scanning: データベースをスキャンしています... - duplicate-owner: 'プレイヤーはデータベース内に複数の島を所有しています: [名前]' + duplicate-owner: 'プレイヤーはデータベース内に複数の島を所有しています: [name]' player-has: 'プレイヤー[name]には[number]の島があります' duplicate-member: 'プレーヤー[name]はデータベース内の複数の島のメンバーです' rank-on-island: '[rank]島の[xyz]' @@ -162,10 +162,10 @@ commands: success: '[name]がこの島の所有者になりました。' extra-islands: '警告:このプレーヤーは現在、[number]島を所有しています。これは、設定またはパーマで許可されている以上のものです:[max]。' maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: <プレイヤー> <サイズ> + description: プレイヤーの[prefix_island]の最大チームサイズを設定する(0でワールドデフォルトにリセット) + success: '[name]の[prefix_island]の最大チームサイズを[number]に設定しました。' + reset: '[name]の[prefix_island]の最大チームサイズをワールドデフォルト([number])にリセットしました。' range: description: 管理島の範囲コマンド invalid-value: @@ -227,7 +227,7 @@ commands: last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: '死亡: [number]' resets-left: 'リセット: [number] (最大: [total])' - max-homes: Max Homes:[number] + max-homes: '最大ホーム数: [number]' team-members-title: チームメンバー team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -244,10 +244,10 @@ commands: purge-protected: 島はパージ保護されています max-protection-range: 最大の歴史的保護範囲:[range] protection-coords: '保護座標: [xz1] - [xz2]' - is-spawn: 島は産卵の島です - banned-players: 禁止選手 + is-spawn: この島はスポーン島です + banned-players: BAN済みプレイヤー banned-format: '[name]' - unowned: 所有 + unowned: 未所有 bundle: '島の作成に使用される青写真バンドル:[name]' switch: description: 保護バイパスのオン/オフを切り替えます @@ -424,7 +424,7 @@ commands: prompt: 名前を入力するか、「quit」で終了します too-long: '長すぎる' pick-a-unique-name: よりユニークな名前を選んでください - stripped-char-in-unique-name: '一部の文字は許可されていないため削除されました。 新しい ID は [名前]になります。' + stripped-char-in-unique-name: '一部の文字は許可されていないため削除されました。 新しい ID は [name]になります。' success: 成功! conversation-prefix: '>' description: @@ -509,7 +509,7 @@ commands: remove: description: プレイヤーの死を取り除く parameters: <プレイヤー> <死> - success: '[number]deathsを[name]に正常に削除し、合計を[total]deathsに減らしました。' + success: '[number]回の死���を[name]から正常に削除し、合計を[total]回に減らしました。' resetname: description: プレイヤーの島名をリセットする success: '[name] の島名が正常にリセットされました。' @@ -640,7 +640,7 @@ commands: description: 島を再起動し、古いものを削除する parameters: <青写真> none-left: あなたはもうリセットが残っている! - resets-left: '残りには[number]個のresetsがあります' + resets-left: '残りリセット回数は[number]回です' confirmation: |- これを実行してもよろしいですか? すべての島のメンバーは島から追い @@ -737,21 +737,21 @@ commands: coop: description: 島でプレイヤーコープランクを確認 parameters: <プレイヤー> - cannot-coop-yourself: 自分を生協することはできません! + cannot-coop-yourself: 自分を協力メンバーにすることはできません! already-has-rank: プレイヤーはすでにランクを持っている! - you-are-a-coop-member: あなたは [name]に閉じこもっれた + you-are-a-coop-member: あなたは[name]の島の協力メンバーになりました success: '[name]を協力メンバーにしました' name-has-invited-you: '[name] はあなたを彼らの島の協力メンバーとして招待しています。' uncoop: description: プレイヤーから生協のランクを削除する parameters: <プレイヤー> - cannot-uncoop-yourself: 自分にそれを行うことはできません! + cannot-uncoop-yourself: 自分に対してそれを行うことはできません! cannot-uncoop-member: チームメンバーを uncoop ことはできません! - player-not-cooped: プレイヤーは閉じこもっではありません! - you-are-no-longer-a-coop-member: あなたはもはや[name]の島の生協のメンバーではない - all-members-logged-off: 'すべての島のメンバーがログオフしたため、あなたはもはや[name]の島の協同組合員ではありません' - success: '[name]isはもはやあなたの島の協同組合員ではありません。' - is-full: 'これ以上生協メンバーを追加することはできません' + player-not-cooped: プレイヤーは協力メンバーではありません! + you-are-no-longer-a-coop-member: あなたはもう[name]の島の協力メンバーではありません + all-members-logged-off: 'すべての島のメンバーがログオフしたため、あなたはもう[name]の島の協力メンバーではありません' + success: '[name]はもうあなたの島の協力メンバーではありません。' + is-full: 'これ以上協力メンバーを追加することはできません' trust: description: 島でプレイヤーに信頼できるランクを与える parameters: <プレイヤー> @@ -832,7 +832,7 @@ commands: parameters: <プレーヤー> player-kicked: '[gamemode] で [name] によってあなたは島から追い出されました!' cannot-kick: 自分を削除することはできません! - cannot-kick-rank: 'あなたのランクでは [名前] をキックすることはできません!' + cannot-kick-rank: 'あなたのランクでは [name] をキックすることはできません!' success: '[name]はあなたの島から追い出されました。' demote: description: ランクダウンあなたの島のプレーヤーを降格 @@ -873,14 +873,14 @@ commands: owner-banned-you: '[name]は、彼らの島からあなたを禁止!' you-are-banned: あなたはこの島から禁止されています! unban: - description: あなたの島から選手を同時 - parameters: <プレーヤー> - cannot-unban-yourself: 自分を同時ことはできない! + description: プレイヤーの島からのBANを解除する + parameters: <プ��ーヤー> + cannot-unban-yourself: ��分のBAN解除はできません! player-not-banned: プレイヤーは禁止されていません player-unbanned: '[name]は現在、あなたの島から禁止されていません。' you-are-unbanned: '[name]は島からあなたをブロックを解除!' banlist: - description: リスト禁止選手 + description: BAN済みプレイヤーを一覧表示 noone: この島では誰も禁止されていない the-following: 以下の選手は禁止されている names: '[line]' @@ -911,8 +911,8 @@ ranks: sub-owner: サブ所有者 member: メンバー trusted: 信頼 - coop: 生協 - visitor: 訪問 者 + coop: 協力者 + visitor: 訪問者 banned: 禁止 admin: 管理者 mod: モデレーター @@ -920,9 +920,9 @@ protection: command-is-banned: コマンドは、訪問者のために禁止され flags: ALLAY: - name: アレイ・Copper Golem相互作用 - description: Allay と Copper Golem との間でアイテムの授受を許可する - hint: アレイ・Copper Golemインタラクションが無効になっています + name: アレ���・銅のゴーレムの相互作用 + description: アレイと銅のゴーレムとの間でアイテム��授受を許可する + hint: アレ���・銅のゴーレムのインタラクションが無効になっていま��� ANIMAL_NATURAL_SPAWN: description: 自然な動物の産卵を切り替えます name: 動物の自然なスポーン @@ -939,7 +939,7 @@ protection: hint: アーマースタンド使用不可 AXOLOTL_SCOOPING: name: ウーパールートルすくい - description: バケツを使ってウーバーイーツをすくえるようにする + description: バケツを使ってウーパールーパーをすくえるようにする hint: ウーパールーパーすくいが無効になっています BEACON: description: トグル使用 @@ -1030,7 +1030,7 @@ protection: CRAFTER: name: クラフター description: トグルの使用 - hint: Crafter access disabled + hint: クラフターへのアクセスが��効になっています BLOCK_EXPLODE_DAMAGE: description: |- ベッドとリスポーンアンカーを許可する @@ -1230,8 +1230,8 @@ protection: FLINT_AND_STEEL: name: フリントとスチール description: |- - を使用してプレイヤーに火を点ける - &アフリントと鉄鋼または火災料。 + フリン��と鉄鋼または火薬を使用して + プレイヤーが火を点けることを許可する。 hint: フリントとスチールと火のチャージは無効です FURNACE: description: トグル使用 @@ -1249,9 +1249,9 @@ protection: name: '生き物を島に限る' HARVEST: description: |- - 作物を収穫できる人を設定します。 - アイテムを許可することを忘れないでください - &ピックアップも! + 作物を収穫で��る人を設定します。 + アイテムのピックアップも許可する + ことを忘れないでください! name: 作物の収穫 hint: 作物の収穫が無効になっています HIVE: @@ -1277,8 +1277,8 @@ protection: ITEM_FRAME: name: アイテムフレーム description: |- - Toggleインタラクション。 - ブロックの配置または分割をオーバーライドします + インタラクションを切り替えます。 + ブロックの配置または破壊をオーバーライドします。 hint: アイテムフレームの使用は無効です ITEM_FRAME_DAMAGE: description: |- @@ -1411,11 +1411,11 @@ protection: name: オフライン成長 OFFLINE_REDSTONE: description: |- - 無効にすると、レッドストーン - willは島では機能しません - すべてのメンバーがオフラインです。 - Mayは遅延の削減に役立ちます。 - スポーン島には影響しません。 + 無効にすると、すべてのメンバーが + オフラインの場合、レッドストーンは + 島では機能しません。 + 遅延の削減に役立つかもしれません。 + スポーン島には影響しません。 name: オフラインレッドストーン PETS_STAY_AT_HOME: description: |- @@ -1591,15 +1591,15 @@ protection: アイテムと経験値が死亡した場合 彼らが訪問者である島。 - アイランドのメンバーはまだアイテムを失っています - そして、彼らが自分の島で死んだ場合! + 島のメンバーは自分の島で死んだ場合、 + アイテムを失います! SPAWN_PROTECTION: - name: Spawn island void protection + name: スポーン島の奈落保護 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 有効にすると、スポーン島で奈落に + 落ちたプレイヤーは死亡する代わりに + スポーンポイントにテレポート + されま���。 RAID_TRIGGER: name: 襲撃のトリガー description: 襲撃を引き起こすために必要な島の最低ランクを設定します @@ -1607,9 +1607,9 @@ protection: ENTITY_PORTAL_TELEPORT: name: エンティティポータルの使用法 description: |- - エンティティ (非プレイヤー) ができるかどうかを切り替えます。 - ポータルを使用して間をテレポートします - 寸法() + エンティティ(非プレイヤー)が + ポータルを使用してディメンション間を + テレポートできるかどうかを切り替えます。 WIND_CHARGE: name: ウィンドチャージ description: |- @@ -1618,7 +1618,7 @@ protection: ウィンドチャージを使用できません。 hint: ウィンドチャージの使用が無効 WITHER_DAMAGE: - name: 許可/禁止 + name: ウィザーダメージの切り替え description: |- アクティブな場合、枯れます ブロックとプレイヤーを破損 @@ -1654,10 +1654,10 @@ protection: description: '使用可能なすべての設定を表示します。' click-to-switch: 'クリックして[next]に切り替えます。' reset-to-default: - name: 'Reset to default' + name: 'デフォルトにリセット' description: | - ResetsALLthe settings to their - デフォルト値。 + すべての設定をデフォルト値 + にリセットします。 confirm: confirm instructions: '本当にいいですか? "confirm" と入力してすべてをリセットしてください。' PROTECTION: @@ -1854,7 +1854,7 @@ catalog: 設定を変更するか、後で再試行してください。 enums: DamageCause: - CONTACT: 衝突 + CONTACT: 接触ダメージ ENTITY_ATTACK: エンティティ攻撃 ENTITY_SWEEP_ATTACK: エンティティスイープ攻撃 PROJECTILE: 発射物 @@ -1867,7 +1867,7 @@ enums: DROWNING: 溺死 BLOCK_EXPLOSION: ブロック爆発 ENTITY_EXPLOSION: エンティティの爆発 - VOID: 無効 + VOID: 奈落 LIGHTNING: ライトニング SUICIDE: 自殺 STARVATION: 飢餓 @@ -1880,12 +1880,12 @@ enums: CUSTOM: カスタム FLY_INTO_WALL: 壁に飛ぶ HOT_FLOOR: ホットフロア - CRAMMING: 一夜漬け + CRAMMING: 押し潰し DRYOUT: 完全に乾く FREEZE: フリーズ KILL: 殺す SONIC_BOOM: ソニックブーム - WORLD_BORDER: 世界国境 + WORLD_BORDER: ワールドボーダー panel: credits: title: '[name]クレジット' From a570116f02124735c7df7f4f5be54d80669790ae Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:18:21 -0700 Subject: [PATCH 35/95] Fix Ukrainian (uk.yml) locale: translate remaining English strings and fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate `maxsize` section (description, success, reset messages) - Translate `SPAWN_PROTECTION` flag name and description - Translate "Placeholder Browser" panel titles to "Браузер замінників" - Fix WITHER_DAMAGE: "вітер-скелета/вітери" (means "wind") to "візера/візери" (correct Minecraft transliteration) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/uk.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/resources/locales/uk.yml b/src/main/resources/locales/uk.yml index 0d8ee8681..9c9559f51 100644 --- a/src/main/resources/locales/uk.yml +++ b/src/main/resources/locales/uk.yml @@ -172,9 +172,9 @@ commands: extra-islands: 'Увага: тепер цей гравець має [number] островів. Це більше ніж дозволено налаштуваннями або пермами: [max].' maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: встановити максимальний розмір команди для [prefix_island] гравця (0 для скидання до типового значення світу) + success: 'Встановлено максимальний розмір команди [prefix_island] гравця [name] на [number].' + reset: 'Скинуто максимальний розмір команди [prefix_island] гравця [name] до типового значення світу ([number]).' range: description: адмін-команда діапазону [prefix_island] invalid-value: @@ -1634,12 +1634,12 @@ protection: Учасники [prefix_Island] все одно втрачають свої предмети на власному [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Захист від порожнечі на спавн-острові description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Якщо ввімкнено, гравці, які впадуть + у порожнечу на спавн-острові, + будуть телепортовані назад на точку + спавну замість смерті. RAID_TRIGGER: name: Запуск рейду description: Встановлює мінімальний ранг острова для запуску рейду @@ -1658,9 +1658,9 @@ protection: використовувати вітрові заряди на цьому острові. hint: Використання вітрових зарядів вимкнено WITHER_DAMAGE: - name: Перемикає шкоду від вітер-скелета + name: Шкода від візера description: |- - Якщо ввімкнено, вітери можуть + Якщо ввімкнено, візери можуть пошкоджувати блоки й гравців WORLD_BLOCK_EXPLODE_DAMAGE: description: |- @@ -1979,7 +1979,7 @@ panels: author: '- [name]' selected: 'Наразі обрано.' placeholder: - title: 'Placeholder Browser' + title: 'Браузер замінників' buttons: bentobox: name: 'BentoBox' @@ -2018,7 +2018,7 @@ panels: description: 'Повернутися до списку аддонів' # The set of common buttons used in multiple panels. placeholder: - title: 'Placeholder Browser' + title: 'Браузер замінників' buttons: bentobox: name: 'BentoBox' From 6911b263e013866ed28ac30adabf9cde12b4e4b3 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:18:28 -0700 Subject: [PATCH 36/95] Fix Croatian (hr.yml) locale: fix broken tags, mistranslations, and untranslated strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English strings: maxsize section, SPAWN_PROTECTION flag - Fix conversation-prefix containing AI response text, replaced with '>' - Fix 12 broken '&' legacy color codes to proper MiniMessage tags - Fix broken [description] placeholder layout entries (pis]) - Fix 12+ translated placeholders that must stay English: [opis]->[description], [datum]->[date], [poruka]->[message], [sekundi]->[seconds], [postavka]->[setting], [redak]->[line], [prikaz]->[display], [tema]->[topic], [instaliraj]->[install], [vrijeme]->[time], [svijetu]->[world], [ime_svijeta]->[world_name], etc. - Fix wrong translations: "mrijest" (fish spawning) -> "spawn"/"pojavljivanje" for spawn points and mob spawning, "Kavez" (cage) -> "Suradnik" for coop rank, "Rafter" -> "Crafter", "Zbor voće" (choir fruit) -> "Chorus voće", "prsni koš" (ribcage) -> "škrinja" for chest damage, "greben" (reef) -> "Wither", "Krajman" -> "Enderman", "mafija" -> "entitet", "metla" (broom) -> "zamah" (sweep) - Fix DamageCause enums: VOID "Poništiti" -> "Praznina", WITHER "uvenuti" -> "Wither", ENTITY_ATTACK "Napad mafije" -> "Napad entiteta", BLOCK_EXPLOSION "Blokiraj" -> "Eksplozija bloka" - Fix missing tags on multi-line descriptions - Fix "Seljanin ozlijeđen invalid" hint text Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/hr.yml | 174 +++++++++++++++--------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/main/resources/locales/hr.yml b/src/main/resources/locales/hr.yml index 54b3a7f41..c1e1d09a1 100644 --- a/src/main/resources/locales/hr.yml +++ b/src/main/resources/locales/hr.yml @@ -11,7 +11,7 @@ prefixes: an-island: otok islands: ostrva general: - success: '&uspjeh!' + success: 'Uspjeh!' invalid: Neispravno beta: 'Ova je naredba u beta verziji. Obavezno imate sigurnosne kopije!' errors: @@ -188,10 +188,10 @@ commands: Upozorenje: ovaj igrač sada posjeduje [number] otoka. To je više od dopuštenog prema postavkama ili dozvolama: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: postavite maksimalnu veličinu tima za igračev [prefix_island] (koristite 0 za vraćanje na zadanu vrijednost svijeta) + success: 'Postavljeno [name] [prefix_island] maksimalna veličina tima na [number].' + reset: 'Vraćeno [name] [prefix_island] maksimalna veličina tima na zadanu vrijednost svijeta ([number]).' range: description: admin island range command invalid-value: @@ -243,7 +243,7 @@ commands: cannot-make-island: >- Ovdje se ne može smjestiti otok, nažalost. Pogledajte konzolu za moguće pogreške. - island-is-spawn: 'Otok je mrijest. Jesi li siguran? Ponovno unesite naredbu za potvrdu.' + island-is-spawn: 'Otok je spawn. Jeste li sigurni? Ponovno unesite naredbu za potvrdu.' unregister: parameters: [x,y,z] description: odjaviti vlasnika s otoka, ali zadržati otočne blokove @@ -259,7 +259,7 @@ commands: title: '========== Informacije o otoku ============' island-uuid: 'UUID: [uuid]' owner: 'Vlasnik: [owner] ([uuid])' - last-login: 'Zadnja prijava: [datum]' + last-login: 'Zadnja prijava: [date]' last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: 'Smrti: [number]' resets-left: 'Poništavanje: [number] (Maksimalno: [total])' @@ -280,7 +280,7 @@ commands: purge-protected: Otok je zaštićen od čišćenja max-protection-range: 'Najveći povijesni raspon zaštite: [range]' protection-coords: 'Koordinate zaštite: [xz1] do [xz2]' - is-spawn: Otok je otok za mrijest + is-spawn: Otok je spawn otok banned-players: 'Zabranjeni igrači:' banned-format: '[name]' unowned: 'Neposjedovan' @@ -361,19 +361,19 @@ commands: xyz-error: 'Navedite tri cjelobrojne koordinate: npr. 100 120 100' setspawn: description: postavite otok kao spawn za ovaj gamemode - already-spawn: 'Ovaj otok je već mrijest!' + already-spawn: 'Ovaj otok je već spawn!' no-island-here: 'Ovdje nema otoka.' confirmation: >- Jeste li sigurni da želite postaviti ovaj otok kao mjesto nastanka ovog svijeta? - success: 'Uspješno postavite ovaj otok kao mrijest za ovaj svijet.' + success: 'Uspješno postavite ovaj otok kao spawn za ovaj svijet.' setspawnpoint: - description: postavite trenutnu lokaciju kao točku mrijesta za ovaj otok + description: postavite trenutnu lokaciju kao spawn točku za ovaj otok no-island-here: 'Ovdje nema otoka.' confirmation: >- Jeste li sigurni da želite postaviti ovu lokaciju kao točku mriještenja za ovaj otok? - success: 'Uspješno postavite ovu lokaciju kao točku mrijesta za ovaj otok.' + success: 'Uspješno postavite ovu lokaciju kao spawn točku za ovaj otok.' island-spawnpoint-changed: '[user] je promijenio točku pojavljivanja otoka.' settings: parameters: >- @@ -389,7 +389,7 @@ commands: file-exists: 'Datoteka već postoji, prepisati?' no-such-file: 'Nema takve datoteke!' could-not-load: 'Nije moguće učitati tu datoteku!' - could-not-save: 'Hmm, nešto nije u redu prilikom spremanja te datoteke: [poruka]' + could-not-save: 'Hmm, nešto nije u redu prilikom spremanja te datoteke: [message]' set-pos1: 'Pozicija 1 postavljena na [vector]' set-pos2: 'Položaj 2 postavljen na [vector]' set-different-pos: 'Postavite drugu lokaciju - ova pozicija je već postavljena!' @@ -441,7 +441,7 @@ commands: parameters: description: preimenovati nacrt success: >- - Nacrt [old] je uspješno preimenovan u [prikaz]. Naziv + Nacrt [old] je uspješno preimenovan u [display]. Naziv datoteke sada je [name]. pick-different-name: 'Navedite naziv koji se razlikuje od trenutnog naziva nacrta.' management: @@ -482,7 +482,7 @@ commands: Neki su znakovi uklonjeni jer nisu dopušteni. Novi ID će biti [name]. success: Uspjeh! - conversation-prefix: Sure, please provide the text you would like translated to Croatian. + conversation-prefix: '>' description: quit: prestati instructions: | @@ -622,7 +622,7 @@ commands: players: '[prefix_bentobox]Migracija igrača' names: '[prefix_bentobox]Premještanje imena' addons: '[prefix_bentobox]Migrirajući dodaci' - class: '[prefix_bentobox]Migracija [opis]' + class: '[prefix_bentobox]Migracija [description]' migrated: '[prefix_bentobox]Migrirano' completed: '[prefix_bentobox]Završeno' rank: @@ -638,7 +638,7 @@ commands: failure: 'Neuspješno uklanjanje [rank]. Nepoznata titula.' list: 'Registrirane rangove su sljedeće:' confirmation: - confirm: 'Ponovno upišite naredbu unutar [sekundi]sza potvrdu.' + confirm: 'Ponovno upišite naredbu unutar [seconds]sza potvrdu.' previous-request-cancelled: 'Prethodni zahtjev za potvrdu otkazan.' request-cancelled: 'Istek potvrde - zahtjev otkazan.' delay: @@ -661,8 +661,8 @@ commands: help: description: glavna otočka komanda spawn: - description: teleportirati vas u mrijest - teleporting: 'Teleportira vas u mrijest.' + description: teleportirati vas na spawn + teleporting: 'Teleportira vas na spawn.' no-spawn: 'U ovom modu igre nema spawn-a.' create: description: stvorite otok, koristeći izborni nacrt (zahtijeva dopuštenje) @@ -682,7 +682,7 @@ commands: estimated-time: 'Procijenjeno vrijeme: [number] sekundi.' blocks: 'Izgradnja blok po blok: [number] blokova u svim...' entities: 'Popunjavanje entitetima: [number] entiteta u svim...' - dimension-done: 'otok u [svijetu] je izgrađen.' + dimension-done: 'otok u [world] je izgrađen.' done: 'Gotovo! Vaš otok je spreman i čeka vas!' pick: 'Odaberite otok' cannot-afford: 'Ne možete si to priuštiti! Cijena: [cost]' @@ -791,7 +791,7 @@ commands: description: prikazati detaljne informacije o vašem timu member-layout: online: 'o [name]' - offline: 'o [name] ([posljednje_viđeno])' + offline: 'o [name] ([last_seen])' offline-not-last-seen: 'o [name]' last-seen: layout: '[number] [unit] prije' @@ -972,7 +972,7 @@ commands: description: popis zabranjenih igrača noone: 'Nitko nije zabranjen na ovom otoku.' the-following: 'Sljedeći igrači su zabranjeni:' - names: '[redak]' + names: '[line]' you-can-ban: 'Možete zabraniti do [number] više igrača.' settings: description: prikaz postavki otoka @@ -1000,7 +1000,7 @@ ranks: sub-owner: Podvlasnik member: Član trusted: Pouzdan - coop: Kavez + coop: Suradnik visitor: Posjetitelj banned: zabranjeno admin: Administrator @@ -1014,10 +1014,10 @@ protection: hint: Interakcija Allay i Copper Golem onemogućena ANIMAL_NATURAL_SPAWN: description: Uključi/isključi prirodno mriještenje životinja - name: Prirodni mrijest životinja + name: Prirodno pojavljivanje životinja ANIMAL_SPAWNERS_SPAWN: - description: Prebacivanje mriještenja životinja pomoću mrijesta - name: Mrijest životinja + description: Prebacivanje pojavljivanja životinja pomoću spawnera + name: Spawner životinja ANVIL: description: Uključi/isključi interakciju name: Nakovnji @@ -1103,10 +1103,10 @@ protection: description: |- Prebaci interakciju sa svim spremnicima. Uključuje: bačvu, pčelinju košnicu, stalak za kuhanje, - & škrinja, komposter, dozator, kapaljka, - & teglica za cvijeće, peć, spremnik, okvir predmeta, - & jukebox, škrinja s kolicima, kutija za šulkere, - &zarobljena škrinja. + škrinja, komposter, dozator, kapaljka, + teglica za cvijeće, peć, spremnik, okvir predmeta, + jukebox, škrinja s kolicima, kutija za šulkere, + zarobljena škrinja. Promjena pojedinačnih postavki nadjačava ovu zastavu. @@ -1123,7 +1123,7 @@ protection: description: Uključivanje interakcije bačve hint: Pristup bačvi onemogućen CRAFTER: - name: Rafter + name: Crafter description: Upotreba prebacivanja hint: Crafter pristup onemogućen BLOCK_EXPLODE_DAMAGE: @@ -1187,10 +1187,10 @@ protection: hint: Interakcija lijevka onemogućena CHEST_DAMAGE: description: Uključite/isključite oštećenja prsa od eksplozija - name: Oštećenje prsnog koša + name: Oštećenje škrinja CHORUS_FRUIT: description: Uključi/isključi teleportaciju - name: Zbor voće + name: Chorus voće hint: Teleportiranje Chorus voća onemogućeno CLEAN_SUPER_FLAT: description: |- @@ -1233,12 +1233,12 @@ protection: CREEPER_DAMAGE: description: | Preklopni puzavac - & zaštita od oštećenja + zaštita od oštećenja name: Zaštita od oštećenja puzavice CREEPER_GRIEFING: description: | Uključi/isključi žalovanje puzavice - zaštita pri paljenju + zaštita pri paljenju od posjetitelja otoka. name: Creeper griefing zaštita hint: Creeper žalovanje onemogućeno @@ -1283,17 +1283,17 @@ protection: Endermen će pasti bilo koji blok su holding ako je ubijen. - name: Krajmanov pad smrti + name: Enderman ispuštanje pri smrti ENDERMAN_GRIEFING: description: |- Endermen može ukloniti blokova od otoka - name: Enderman tuguje + name: Enderman griefing ENDERMAN_TELEPORT: description: |- Endermen se može teleportirati ako je aktivan. - name: Endermanov teleport + name: Enderman teleportacija ENDER_PEARL: description: Uključi/isključi upotrebu name: EnderBiseri @@ -1307,7 +1307,7 @@ protection: now-leaving: 'Sada napuštam [name].' now-leaving-your-island: 'Sada napuštam vaš otok: [name]' EXPERIENCE_BOTTLE_THROWING: - name: Doživite bacanje boce + name: Bacanje boca iskustva description: Uključi/isključi bacanje boca iskustva. hint: Boce iskustva onemogućene FIRE_BURNING: @@ -1358,7 +1358,7 @@ protection: description: |- Postavite tko može žeti usjeve. Ne zaboravite dopustiti stavku - i preuzimanje također! + i preuzimanje također! name: Berba usjeva hint: Žetva usjeva onemogućena HIVE: @@ -1382,7 +1382,7 @@ protection: HURT_VILLAGERS: description: Prebaci ranjavanje name: Povrijeđeni seljani - hint: Seljanin ozlijeđen invalid + hint: Ranjavanje seljana onemogućeno ITEM_FRAME: name: Okvir predmeta description: |- @@ -1441,7 +1441,7 @@ protection: description: |- Ograniči entitete od spawning u ovoj igri - & način rada. + način rada. name: 'Ograničite stvaranje tipa entiteta' can: 'Može se mrijestiti' cannot: 'Ne može se pojaviti' @@ -1465,7 +1465,7 @@ protection: name: Promijeniti postavke description: |- Dopusti promjenu člana - &uloga može promijeniti postavke otoka. + uloga može promijeniti postavke otoka. MILKING: description: Uključi/isključi mužnju krava name: Mužnja @@ -1478,7 +1478,7 @@ protection: hint: Interakcija s kolicima je onemogućena MONSTER_NATURAL_SPAWN: description: Uključi/isključi pojavu prirodnog čudovišta - name: Čudovišni prirodni mrijest + name: Prirodno pojavljivanje čudovišta MONSTER_SPAWNERS_SPAWN: description: Prebacivanje mriještenja čudovišta pomoću mriještenja name: Mrijesti čudovišta @@ -1536,14 +1536,14 @@ protection: neće poslovati na otocima gdje su svi članovi izvan mreže. Može pomoći u smanjenju kašnjenja. - Ne utječe na otok mrijesta. - name: Offline Crvena kamenčina + Ne utječe na spawn otok. + name: Offline Redstone PETS_STAY_AT_HOME: description: |- Kada je aktivan, pripitomljeni ljubimci može ići samo u i - ne može napustiti vlasnika - odni otok. + ne može napustiti vlasnikov + otok. name: Kućni ljubimci ostaju kod kuće PISTON_PUSH: description: |- @@ -1635,13 +1635,13 @@ protection: hint: Šišanje onemogućeno SPAWN_EGGS: description: Uključi/isključi upotrebu - name: Mrijest jaja - hint: Mrijest jaja onemogućena + name: Spawn jaja + hint: Spawn jaja onemogućena SPAWNER_SPAWN_EGGS: description: |- Omogućuje promjenu vrste entiteta spawnera - pomoću jajašca mrijesta. - name: Mrijest jaja na mrijestionicama + pomoću spawn jaja. + name: Spawn jaja na spawnerima hint: promjena tipa entiteta spawnera korištenjem spawn jaja nije dopuštena SCULK_SENSOR: description: |- @@ -1686,7 +1686,7 @@ protection: name: Drveće raste izvan dometa description: |- Uključivanje/isključivanje može li drveće rasti izvan - Domet zaštite otoka ili ne. + dometa zaštite otoka ili ne. Ne samo da će spriječiti postavljanje sadnica izvan dometa zaštite otoka od raste, ali će također blokirati generaciju @@ -1701,7 +1701,7 @@ protection: name: Frost Walker hint: Frost Walker onemogućen EXPERIENCE_PICKUP: - name: Doživite preuzimanje + name: Preuzimanje iskustva description: Uključi/isključi preuzimanje kugle iskustva hint: Preuzimanje iskustva onemogućeno PREVENT_TELEPORT_WHEN_FALLING: @@ -1718,15 +1718,15 @@ protection: predmeti i iskustvo ako umru na otok na kojem su oni posjetitelji. - Članovi Islanda i dalje gube svoje predmete + Članovi otoka i dalje gube svoje predmete ako umru na vlastitom otoku! SPAWN_PROTECTION: - name: Spawn island void protection + name: Zaštita od praznine na spawn otoku description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Kada je omogućeno, igrači koji padnu + u prazninu na spawn otoku + bit će teleportirani natrag na + točku pojavljivanja umjesto da umru. RAID_TRIGGER: name: Pokretanje racije description: Postavlja minimalni rang otoka potreban za pokretanje racije @@ -1745,9 +1745,9 @@ protection: koristiti vjetrene naboje na ovom otoku. hint: Upotreba vjetrenih naboja onemogućena WITHER_DAMAGE: - name: Prebaci oštećenje venuća + name: Prebaci Wither oštećenje description: |- - Ako je aktivan, greben može + Ako je aktivan, Wither može oštetiti blokove i igrače WORLD_BLOCK_EXPLODE_DAMAGE: description: |- @@ -1763,9 +1763,9 @@ protection: name: Svjetska TNT šteta locked: 'Ovaj otok je zaključan!' locked-island-bypass: 'Ovaj [prefix_island] je zaključan, ali imate dozvolu za pristup.' - protected: 'Otok zaštićen: [opis].' - world-protected: 'Svijet zaštićen: [opis].' - spawn-protected: 'Spawn zaštićeno: [opis].' + protected: 'Otok zaštićen: [description].' + world-protected: 'Svijet zaštićen: [description].' + spawn-protected: 'Spawn zaštićeno: [description].' panel: next: 'Sljedeća stranica' previous: 'Prethodna stranica' @@ -1779,12 +1779,12 @@ protection: expert: name: 'Stručne postavke' description: 'Prikazuje sve dostupne postavke.' - click-to-switch: 'Kliknite za prebacivanje na [sljedeće].' + click-to-switch: 'Kliknite za prebacivanje na [next].' reset-to-default: name: 'Vrati na zadano' description: | Resetira SVE postavke na njihove - &zadana vrijednost. + zadana vrijednost. confirm: potvrdi instructions: 'Jeste li sigurni? Upisite "potvrdi" da biste resetirali sve.' PROTECTION: @@ -1798,15 +1798,15 @@ protection: Opće postavke za ovaj otok WORLD_SETTING: - title: '[ime_svijeta] Postavke' + title: '[world_name] Postavke' description: 'Postavke za ovaj svijet igre' WORLD_DEFAULTS: title: '[world_name] Svjetske zaštite' description: | Postavke zaštite kada - & igrač je izvan svog otoka + igrač je izvan svog otoka flag-item: - name-layout: '&ime]' + name-layout: '[name]' command-instructions: setname: |- Odaberite rang koji može @@ -1860,7 +1860,7 @@ protection: Odaberite rang koji može koristiti naredbu za granicu description-layout: | - pis] + [description] Lijevi klik za kretanje prema dolje. Desni klik za kretanje prema gore. @@ -1870,16 +1870,16 @@ protection: blocked-rank: '- [rank]' minimal-rank: '- [rank]' menu-layout: | - pis] + [description] Kliknite za otvaranje. setting-cooldown: 'Postavka je na hlađenju' setting-layout: | - pis] + [description] Kliknite za prebacivanje. - Trenutna postavka: [postavka] + Trenutna postavka: [setting] setting-active: 'Aktivan' setting-disabled: 'Onemogućeno' management: @@ -1895,7 +1895,7 @@ management: gamemode: name: '[name]' description: | - Otoci: [otoci] + Otoci: [islands] addons: name: 'Dodaci' description: 'Kliknite za prikaz trenutno učitanih dodataka' @@ -1973,16 +1973,16 @@ catalog: name: 'Dodaci' description: | Kliknite za pregledavanje - & dostupni službeni dodaci. + dostupni službeni dodaci. icon: description-template: | - [tema] - [instaliraj] + [topic] + [install] - [opis] + [description] Kliknite da biste dobili vezu na - & najnovije izdanje. + najnovije izdanje. already-installed: Već instalirano! install-now: Sada instalirati! empty-here: @@ -1995,8 +1995,8 @@ catalog: enums: DamageCause: CONTACT: Kontakt - ENTITY_ATTACK: Napad mafije - ENTITY_SWEEP_ATTACK: Napad s metlom + ENTITY_ATTACK: Napad entiteta + ENTITY_SWEEP_ATTACK: Zamašni napad PROJECTILE: Projektil SUFFOCATION: Gušenje FALL: Pad @@ -2005,15 +2005,15 @@ enums: MELTING: Topljenje LAVA: Lava DROWNING: Utapanje - BLOCK_EXPLOSION: Blokiraj eksploziju + BLOCK_EXPLOSION: Eksplozija bloka ENTITY_EXPLOSION: Eksplozija entiteta - VOID: Poništiti + VOID: Praznina LIGHTNING: Munja SUICIDE: Samoubojstvo STARVATION: Gladovanje POISON: Otrov - MAGIC: magija - WITHER: uvenuti + MAGIC: Magija + WITHER: Wither FALLING_BLOCK: Padajući blok THORNS: Trnje DRAGON_BREATH: Zmajev dah @@ -2124,4 +2124,4 @@ successfully-loaded: > |_) | ___ _ __ | |_ ___ | |_) | _____ __ 2017. - 2023 | _ < / _ \ '_ \| __/ _ \| _ < / _ \ \/ / | |_) | __/ | | | || (_) | |_) | (_) > < v [version] |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Učitano za - [vrijeme]ms. + [time]ms. From d94e2d7fc42e6b294df57b96b0fa0ae33ff53b1f Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:19:34 -0700 Subject: [PATCH 37/95] Fix Brazilian Portuguese (pt-BR.yml) locale: translate English strings, fix typos and placeholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (parameters, description, success, reset) - Translate SPAWN_PROTECTION flag (name and description) - Translate SETTING panel description from English - Fix conversation-prefix from AI response to '>' - Fix swapped next/previous panel labels - Fix DamageCause FALL: "Outono" (Autumn) -> "Queda" (Fall damage) - Fix DamageCause FLY_INTO_WALL: imperative -> noun form - Translate DamageCause CRAMMING and SONIC_BOOM - Fix PVP_OVERWORLD disabled message saying "Nether" instead of "Overworld" - Fix translated placeholders: [nome]->[name], [ranking]->[rank], [descrição]->[description] - Fix [prefix_Igreja]->[prefix_Island] and [mundo]->[world] in dimension-done - Fix typos: jjogador, Prermitir, Resspawn, desatilitado, nescessária, mebro, dispoível - Fix "desconfiança" (noun) to "remover confiança" (verb) in team-untrust command Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/pt-BR.yml | 70 ++++++++++++++-------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/resources/locales/pt-BR.yml b/src/main/resources/locales/pt-BR.yml index fb53179d5..488e173bc 100644 --- a/src/main/resources/locales/pt-BR.yml +++ b/src/main/resources/locales/pt-BR.yml @@ -185,10 +185,10 @@ commands: Atenção: este jogador agora possui [number] ilhas. Isso é mais do que o permitido pelas configurações ou permissões: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: definir o tamanho máximo da equipe para a [prefix_island] de um jogador (use 0 para redefinir para o padrão do mundo) + success: 'Tamanho máximo da equipe de [name] na [prefix_island] definido para [number].' + reset: 'Tamanho máximo da equipe de [name] na [prefix_island] redefinido para o padrão do mundo ([number]).' range: description: administrar raio das ilhas invalid-value: @@ -264,8 +264,8 @@ commands: resets-left: 'Reinícios: [number] (Máx: [total])' max-homes: 'Max casas: [number]' team-members-title: 'Membros da equipe:' - team-owner-format: '[nome] [rank]' - team-member-format: '[nome] [ranking]' + team-owner-format: '[name] [rank]' + team-member-format: '[name] [rank]' max-team-size: 'Tamanho máximo da equipe: [number]' max-coop-size: 'Tamanho máximo de coop: [number]' max-trusted-size: 'Tamanho máximo de confiança: [number]' @@ -281,7 +281,7 @@ commands: protection-coords: 'Coordenadas da proteção: de [xz1] até [xz2]' is-spawn: Essa ilha é um spawn banned-players: 'Jogadores banidos:' - banned-format: '[nome]' + banned-format: '[name]' unowned: 'Sem dono' bundle: 'Pacote de Blueprint usado para criar a ilha: [name]' switch: @@ -306,7 +306,7 @@ commands: count: 'Ilha [number]:' use-switch: >- Use [label] switchto para trocar a ilha de - um jjogador para uma na lixeira + um jogador para uma na lixeira use-emptytrash: >- Use [label] emptytrash [player]para remover itens da lixeira permanentemente @@ -468,7 +468,7 @@ commands: no-permission: Sem Permissão perm-required: Necessária no-perm-required: Não é possível definir perm para o pacote padrão - perm-not-required: Não nescessária + perm-not-required: Não necessária perm-format: '' remove: Clique com botão direito para apagar blueprint-instruction: | @@ -487,7 +487,7 @@ commands: Alguns caracteres foram removidos porque não são permitidos. O novo ID será [name]. success: Sucesso! - conversation-prefix: Claro! Por favor, forneça o texto que você deseja traduzir. + conversation-prefix: '>' description: quit: sair instructions: | @@ -686,7 +686,7 @@ commands: estimated-time: 'Tempo estimado: [number] segundos.' blocks: 'Construindo bloco por bloco: [number] blocos no total...' entities: 'Colocando as criaturas: [number] criaturas no total...' - dimension-done: '[prefix_Igreja] em [mundo] está construída.' + dimension-done: '[prefix_Island] em [world] está construída.' done: 'Feito! Sua ilha está pronta e esperando por você!' pick: 'Escolha uma ilha' cannot-afford: 'Você não pode pagar isso! Custo: [cost]' @@ -735,7 +735,7 @@ commands: [number] casas. home-set: 'A home de sua ilha foi marcada na sua localização atual.' homes-are: '[prefix_Island] casas são:' - home-list-syntax: '[nome]' + home-list-syntax: '[name]' click-to-teleport: 'Clique para se teletransportar!' nether: not-allowed: 'Você não tem permissão para marcar sua home no Nether.' @@ -848,7 +848,7 @@ commands: description: retirar o cargo de confiável de um jogador parameters: cannot-untrust-yourself: 'Você não pode desconfiar de si mesmo!' - cannot-untrust-member: 'Você não pode desconfiar de um mebro da equipe!' + cannot-untrust-member: 'Você não pode desconfiar de um membro da equipe!' player-not-trusted: 'Esse jogador não é considerado confiável!' you-are-no-longer-trusted: 'Você não é mais um jogador confiável na ilha de [name]!' success: '[name] não é mais um jogador confiável em sua ilha.' @@ -988,7 +988,7 @@ commands: language: description: selecionar idioma parameters: '[idioma]' - not-available: 'Esse idioma não está dispoível.' + not-available: 'Esse idioma não está disponível.' already-selected: 'Você já está usando esse idioma.' expel: description: retirar um jogador da sua ilha @@ -1132,7 +1132,7 @@ protection: hint: Acesso ao artesão desativado BLOCK_EXPLODE_DAMAGE: description: |- - Permitir que Camas & Âncoras de Resspawn + Permitir que Camas & Âncoras de Respawn quebrem blocos e causem dano a entidades. name: Dano de explosão de bloco @@ -1204,7 +1204,7 @@ protection: name: Limpar superplano COARSE_DIRT_TILLING: description: |- - Prermitir obtenção de + Permitir obtenção de terra ao quebrar podzol ou ao arar terra grossa name: Terra grossa @@ -1277,7 +1277,7 @@ protection: ENCHANTING: description: Permitir uso de mesas de encantamento name: Mesas de encantamento - hint: Uso de mesas de encantamento desatilitado + hint: Uso de mesas de encantamento desabilitado ENDER_CHEST: description: Permitir uso/criação name: Baús de Ender @@ -1610,7 +1610,7 @@ protection: name: PVP no Overworld hint: 'PVP desabilitado no Overworld' enabled: 'O PVP no Overworld foi habilitado.' - disabled: 'O PVP no Nether foi desabilitado.' + disabled: 'O PVP no Overworld foi desabilitado.' REDSTONE: description: Permitir uso name: Itens de Redstone @@ -1717,12 +1717,12 @@ protection: Membros de [prefix_Island] ainda perdem seus itens se morrerem em seu próprio [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Proteção contra o vazio na ilha de spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Quando ativado, jogadores que caírem + no vazio na ilha de spawn + serão teleportados de volta ao + ponto de spawn em vez de morrer. RAID_TRIGGER: name: Gatilho de invasão description: Define o rank mínimo de ilha necessário para acionar uma invasão @@ -1747,7 +1747,7 @@ protection: danificar blocos e jogadores WORLD_BLOCK_EXPLODE_DAMAGE: description: |- - Permitir que Camas & Ancoras de Resspawn + Permitir que Camas & Ancoras de Respawn quebrem blocos e causem dano a entidades fora dos limites de [prefix_island]. name: Dano de explosão de bloco do mundo @@ -1762,8 +1762,8 @@ protection: world-protected: 'Mundo protegido: [description].' spawn-protected: 'Spawn protegido: [description].' panel: - next: 'Página anterior' - previous: 'Página seguinte' + next: 'Próxima página' + previous: 'Página anterior' mode: advanced: name: 'Configurações avançadas' @@ -1790,8 +1790,8 @@ protection: SETTING: title: 'Configurações' description: |- - General settings - for this island + Configurações gerais + para esta [prefix_island] WORLD_SETTING: title: 'Configurações de [world_name]' description: 'Configurações para esse mundo de jogo' @@ -1801,7 +1801,7 @@ protection: Configurações de proteção para quando o jogador está fora de sua ilha flag-item: - name-layout: '[nome]' + name-layout: '[name]' command-instructions: setname: |- Selecione o cargo que pode @@ -1832,7 +1832,7 @@ protection: descooperar team-untrust: |- Selecione o cargo que pode - desconfiança + remover confiança team-promote: |- Selecione a classificação que pode promover a classificação do jogador @@ -1990,7 +1990,7 @@ enums: ENTITY_SWEEP_ATTACK: Ataque de Varredura PROJECTILE: Projétil SUFFOCATION: Sufocação - FALL: Outono + FALL: Queda FIRE: Fogo FIRE_TICK: Queimando MELTING: Derretendo @@ -2009,13 +2009,13 @@ enums: THORNS: Espinhos DRAGON_BREATH: Sopro do Dragão CUSTOM: Personalizado - FLY_INTO_WALL: Voe para a parede + FLY_INTO_WALL: Colisão com parede HOT_FLOOR: 'Piso Quente' - CRAMMING: Cramming + CRAMMING: Esmagamento por entidades DRYOUT: Secagem FREEZE: Congelar KILL: Matar - SONIC_BOOM: Sonic Boom + SONIC_BOOM: Explosão Sônica WORLD_BORDER: Limite do Mundo panel: credits: @@ -2041,7 +2041,7 @@ panels: buttons: bundle: name: '[name]' - description: '[descrição]' + description: '[description]' uses: 'Usado [number]/[max]' unlimited: 'Usos ilimitados permitidos' cost: 'Custo: [cost]' From 9a654001f9268430276fad33e7ae8b6edc6e719b Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:19:44 -0700 Subject: [PATCH 38/95] Fix Polish (pl.yml) locale: translate untranslated sections, fix typos and wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (was entirely English) - Translate SPAWN_PROTECTION flag (was entirely English) - Translate "Placeholder Browser" panel title - Fix name-too-long saying "Too short / Minimum" instead of "Too long / Maximum" - Fix purge completed message saying "cancelled" instead of "completed" - Fix team.fix.done saying "Scan" instead of "Done" - Fix [opis] translated placeholder back to [description] - Fix "purgę" command typo and "Typ" to "Wpisz" - Fix sink translated as "zlew" (kitchen sink) to "tonąć" (submerge) - Fix FISH_SCOOPING: "Łowienie ryb" (fishing) to "Zbieranie ryb wiadrem" (scooping) - Fix BREAK_HOPPERS: broken Polish ("zbijania ich hoppers") to proper translation - Fix BREAK_SPAWNERS: "Złamać spawnerów" (infinitive) to "Łamanie spawnerów" (noun) - Fix resetname description (was broken English word order) - Fix locales description (was "locale[locale]" broken string) - Fix DamageCause enums: WITHER (Zgniatacz->Wither), CUSTOM (Zwyczaj->Niestandardowe), FLY_INTO_WALL (Lecieć->Zderzenie), CRAMMING (untranslated), FREEZE (Zatrzymaj się-> Zamrożenie), KILL (Zabij->Komenda /kill), SONIC_BOOM (untranslated->Fala Uderzeniowa) - Fix Cyrillic "мыши" (Russian) to Polish "myszy" in invite GUI - Fix all duplicate "jest jest" occurrences throughout the file - Fix "zostało jest wyłączone" grammar in PVP disabled messages - Fix PVP_OVERWORLD disabled message color from red to green Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/pl.yml | 118 +++++++++++++++--------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/src/main/resources/locales/pl.yml b/src/main/resources/locales/pl.yml index 4d1e936ab..c172f6add 100644 --- a/src/main/resources/locales/pl.yml +++ b/src/main/resources/locales/pl.yml @@ -119,7 +119,7 @@ commands: total-islands: 'Masz [number] wysp w swojej bazie danych we wszystkich światach.' number-error: 'Argument musi być liczbą dni' confirm: 'Użyj [label] purge confirm, by rozpocząć proces usuwania wysp' - completed: 'Proces usuwania wysp został anulowany.' + completed: 'Proces usuwania wysp został zakończony.' see-console-for-status: >- Rozpoczęto proces czyszczenia wysp. Uruchom konsolę w celu sprawdzenia szczegółowego statusu. @@ -127,7 +127,7 @@ commands: regions: parameters: '[days]' description: Oczyszcz wyspy, usuwając stare pliki regionu - confirm: 'Typ /[label] purgę regions confirm aby rozpocząć czyszczenie' + confirm: 'Wpisz /[label] purge regions confirm aby rozpocząć czyszczenie' protect: description: Przełącz ochronę przed usuwaniem opuszczonych wysp move-to-island: 'Najpierw przenieś się na wyspę!' @@ -170,7 +170,7 @@ commands: bazie danych rank-on-island: '[rangę] na [prefix_island] w [xyz]' fixed: 'Naprawiono' - done: 'Skanuj' + done: 'Gotowe' kick: parameters: description: wyrzuć gracza z drużyny @@ -192,10 +192,10 @@ commands: Uwaga: ten gracz posiada teraz [number] wysp. To więcej niż dozwolone według ustawień lub uprawnień: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Ustaw maksymalny rozmiar drużyny dla [prefix_island] gracza (użyj 0, aby przywrócić domyślne ustawienia świata) + success: 'Ustawiono maksymalny rozmiar drużyny [name] na [prefix_island] na [number].' + reset: 'Zresetowano maksymalny rozmiar drużyny [name] na [prefix_island] do domyślnych ustawień świata ([number]).' range: description: administracyjna komenda obszaru ochrony wysp invalid-value: @@ -414,8 +414,8 @@ commands: sink: description: ustaw ten szablon, aby zanurzył się na dno oceanu po wklejeniu status: 'Plan będzie [status] po wklejeniu' - sink: 'zlew' - not-sink: 'nie tonie' + sink: 'tonąć' + not-sink: 'nie tonąć' no-clipboard: 'Nie ma schematu w schowku. Załaduj lub skopiuj coś.' delete: parameters: @@ -580,7 +580,7 @@ commands: Pomyślnie usunięto [number] śmierci graczowi [name], zmniejszając ich sumę do [total]śmierci. resetname: - description: reset gracz [prefix_island] nazwa + description: zresetuj nazwę [prefix_island] gracza success: 'Pomyślnie zresetowano nazwę [prefix_island] dla [name].' bentobox: description: komenda administracyjna BentoBoxa @@ -606,7 +606,7 @@ commands: jeśli później pojawią się błędy, uruchom ponownie serwer. unknown-addon: 'Nieznany dodatek!' locales: - description: przeładowuje locale[locale] + description: przeładowuje pliki językowe version: plugin-version: 'Wersja BentoBoxa: [version]' description: wyświetla wersje BentoBoxa i jego dodatków @@ -753,7 +753,7 @@ commands: setname: description: ustaw nazwę swojej wyspy name-too-short: 'Zbyt krótka. Minimalna długość to [number] znaków.' - name-too-long: 'Zbyt krótka. Minimalna długość to [number] znaków.' + name-too-long: 'Zbyt długa. Maksymalna długość to [number] znaków.' name-already-exists: 'W tym trybie gry jest już wyspa o tej nazwie.' parameters: success: 'Pomyślnie ustawiono nazwę twojej wyspy na [name].' @@ -884,7 +884,7 @@ commands: , aby zaprosić gracza , aby dołączyć do swojego zespołu RIGHT: - name: 'Kliknij prawym przyciskiem мыши' + name: 'Kliknij prawym przyciskiem myszy' coop: 'aby zaprosić gracza do kooperacji' SHIFT_LEFT: name: 'Przesuń lewy przycisk myszy' @@ -1070,14 +1070,14 @@ protection: description: |- Przełącz łamanie spawnerów. Nadpisuje flagę Łamanie Bloków. - name: Złamać spawnerów - hint: Złamanie spawnera wyłączone + name: Łamanie spawnerów + hint: Łamanie spawnerów wyłączone BREAK_HOPPERS: description: |- - Przełączanie zbijania ich hoppers. - Nadpisuje flagę Zbijanie Bloków. - name: Złam hoppers - hint: Wyłączono niszczenie hoppers + Przełączanie niszczenia lejów. + Nadpisuje flagę Niszczenie Bloków. + name: Łamanie lejów + hint: Niszczenie lejów wyłączone BREEDING: description: Przełącz interakcje name: Rozmnażanie zwierząt @@ -1314,7 +1314,7 @@ protection: FIRE_EXTINGUISH: description: Przełącz gaszenie ognia name: Gaszenie ognia - hint: Gaszenie ognia jest jest wyłączone. + hint: Gaszenie ognia jest wyłączone. FIRE_IGNITE: name: Zapłon ognia description: |- @@ -1324,23 +1324,23 @@ protection: name: Rozprzestrzenianie ognia description: Przełącz rozprzestrzenianie FISH_SCOOPING: - name: Łowienie ryb - description: Zezwól na łowienie ryb za pomocą wiadra - hint: Łowienie ryb jest jest wyłączone. + name: Zbieranie ryb wiadrem + description: Zezwól na zbieranie ryb za pomocą wiadra + hint: Zbieranie ryb wiadrem jest wyłączone. FLINT_AND_STEEL: name: Krzesiwo description: |- Pozwól graczom zapalać ogień za pomocą krzesiwa. - hint: Używanie krzesiwa jest jest wyłączone. + hint: Używanie krzesiwa jest wyłączone. FURNACE: description: Przełącz użycie name: Piec - hint: Używanie piecy jest jest wyłączone. + hint: Używanie piecy jest wyłączone. GATE: description: Przełącz użycie name: Furtki - hint: Używanie furtek jest jest wyłączone. + hint: Używanie furtek jest wyłączone. GEO_LIMIT_MOBS: description: |- Usuń moby wychodzące @@ -1367,22 +1367,22 @@ protection: HURT_ANIMALS: description: Przełącz zabijanie zwierząt name: Zabijanie zwierząt - hint: Zabijanie zwierząt jest jest wyłączone. + hint: Zabijanie zwierząt jest wyłączone. HURT_MONSTERS: description: Przełącz zabijanie potworów name: Zabijanie potworów - hint: Zabijanie potworów jest jest wyłączone. + hint: Zabijanie potworów jest wyłączone. HURT_VILLAGERS: description: Przełącz zabijanie osadników name: Zabijanie osadników - hint: Zabijanie osadników jest jest wyłączone. + hint: Zabijanie osadników jest wyłączone. ITEM_FRAME: name: Ramka na przedmioty description: |- Przełącz interakcję. Nadpisuje ustawienie stawiania i niszczenia bloków - hint: Używanie ramek na przedmioty jest jest wyłączone. + hint: Używanie ramek na przedmioty jest wyłączone. ITEM_FRAME_DAMAGE: description: |- Moby mogą uszkodzić @@ -1410,7 +1410,7 @@ protection: JUKEBOX: description: Przełącz użycie name: Szafa grająca - hint: Używanie szafy grającej jest jest wyłączone. + hint: Używanie szafy grającej jest wyłączone. LEAF_DECAY: name: Gnicie liści description: Pozwól liściom na naturalne gnicie @@ -1430,7 +1430,7 @@ protection: LEVER: description: Przełącz użycie name: Dźwignie - hint: Używanie dźwigni jest jest wyłączone. + hint: Używanie dźwigni jest wyłączone. LIMIT_MOBS: description: |- Ogranicz liczbę jednostek, @@ -1463,11 +1463,11 @@ protection: MILKING: description: Przełącz dojenie krów name: Dojenie - hint: Dojenie krów jest jest wyłączone. + hint: Dojenie krów jest wyłączone. MINECART: name: Wagoniki description: Przełącz interakcje z wagonikami - hint: Używanie wagoników jest jest wyłączone. + hint: Używanie wagoników jest wyłączone. MONSTER_NATURAL_SPAWN: description: Włącz lub wyłącz naturalne pojawianie się potworów name: Naturalne pojawienie się potworów @@ -1549,15 +1549,15 @@ protection: POTION_THROWING: name: Rzucanie mikstur description: 'Przełącz rzucanie mikstur trwałych i rzucanych.' - hint: Rzucanie mikstur jest jest wyłączone. + hint: Rzucanie mikstur jest wyłączone. NETHER_PORTAL: description: Przełącz użycie name: Portal do Netheru - hint: Używanie portali jest jest wyłączone. + hint: Używanie portali jest wyłączone. END_PORTAL: description: Przełącz użycie name: Portal końcowy - hint: Używanie portali jest jest wyłączone. + hint: Używanie portali jest wyłączone. PAUSE_MOB_GROWTH: name: Wstrzymaj wzrost mobów description: |- @@ -1576,7 +1576,7 @@ protection: name: PVP w kresie hint: 'PVP jest wyłączone w świecie kresu.' enabled: 'PVP w świecie kresu zostało włączone.' - disabled: 'PVP w świecie kresu zostało jest wyłączone.' + disabled: 'PVP w świecie kresu zostało wyłączone.' PVP_NETHER: description: |- Włącz / wyłącz PVP @@ -1584,7 +1584,7 @@ protection: name: PVP w piekle hint: 'PVP jest wyłączone w piekle.' enabled: 'PVP w piekle zostało włączone.' - disabled: 'PVP w piekle zostało jest wyłączone.' + disabled: 'PVP w piekle zostało wyłączone.' PVP_OVERWORLD: description: |- Włącz / wyłącz PVP @@ -1592,7 +1592,7 @@ protection: name: PVP na wyspie hint: 'PVP jest wyłączone na wyspie.' enabled: 'PVP na wyspie zostało włączone.' - disabled: 'PVP na wyspie zostało jest wyłączone.' + disabled: 'PVP na wyspie zostało wyłączone.' REDSTONE: description: Przełącz dostęp name: Przedmioty redstone @@ -1611,7 +1611,7 @@ protection: RIDING: description: Przełącz ujeżdzanie zwierząt name: Ujeżdzanie zwierząt - hint: Ujeżdzanie zwierząt jest jest wyłączone. + hint: Ujeżdzanie zwierząt jest wyłączone. SHEARING: description: Przełącz strzyżenie owiec name: Strzyżenie owiec @@ -1625,7 +1625,7 @@ protection: Pozwala zmienić typ jednostki spawnera za pomocą jaja spawnującego. name: Zmiana spawnerów jajami spawnującymi - hint: Zmienianie typu spawnera jajem jest jest wyłączone. + hint: Zmienianie typu spawnera jajem jest wyłączone. SCULK_SENSOR: description: 'Przełącza aktywację sensora sculk.' name: Czujnik Sculk @@ -1652,7 +1652,7 @@ protection: To ustawienie nie nadpisuje ochrony przed użyciem krzesia. name: Używanie TNT - hint: Używanie TNT jest jest wyłączone. + hint: Używanie TNT jest wyłączone. TRADING: description: Przełącz handlowanie name: Handlowanie z osadnikami @@ -1674,7 +1674,7 @@ protection: TURTLE_EGGS: description: Przełącz niszczenie name: Żółwie jaja - hint: Niszczenie żółwich jaj jest jest wyłączone. + hint: Niszczenie żółwich jaj jest wyłączone. FROST_WALKER: description: Przełącz zaklęcie Mroźny Piechur name: Mroźny Piechur @@ -1682,7 +1682,7 @@ protection: EXPERIENCE_PICKUP: name: Podnoszenie doświadczenia description: Przełącz podnoszenie doświadczenia - hint: Podnoszenie doświadczenia jest jest wyłączone. + hint: Podnoszenie doświadczenia jest wyłączone. PREVENT_TELEPORT_WHEN_FALLING: name: Zapobiegaj teleportacji podczas spadania description: |- @@ -1704,12 +1704,12 @@ protection: jeśli umrą na swoim własnym [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Ochrona przed pustką na wyspie spawnu description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Gdy włączone, gracze którzy wpadną + w pustkę na wyspie spawnu + zostaną przeteleportowani z powrotem + do punktu spawnu zamiast zginąć. RAID_TRIGGER: name: Wyzwalanie najazdu description: Ustawia minimalny rang wyspy wymagany do wyzwolenia najazdu @@ -1986,18 +1986,18 @@ enums: STARVATION: Głód POISON: Zatrucie MAGIC: Magia - WITHER: Zgniatacz + WITHER: Wither FALLING_BLOCK: Spadający Blok THORNS: Kolce DRAGON_BREATH: Oddech Smoka - CUSTOM: Zwyczaj - FLY_INTO_WALL: Lecieć w Ścianę + CUSTOM: Niestandardowe + FLY_INTO_WALL: Zderzenie ze Ścianą HOT_FLOOR: Gorąca Podłoga - CRAMMING: Cramming + CRAMMING: Ściśnięcie DRYOUT: Wysuszenie - FREEZE: Zatrzymaj się - KILL: Zabij - SONIC_BOOM: Sonic Boom + FREEZE: Zamrożenie + KILL: Komenda /kill + SONIC_BOOM: Fala Uderzeniowa WORLD_BORDER: Granica Świata panel: credits: @@ -2024,7 +2024,7 @@ panels: buttons: bundle: name: '[name]' - description: '[opis]' + description: '[description]' uses: 'Użyto [number]/[max]' unlimited: 'Nielimitowane użycia dozwolone' cost: 'Koszt: [cost]' @@ -2041,7 +2041,7 @@ panels: author: '- [name]' selected: 'Obecnie wybrane.' placeholder: - title: 'Placeholder Browser' + title: 'Przeglądarka symboli zastępczych' buttons: bentobox: name: 'BentoBox' From 96771b15beb158c8b7bbd291e964957357d24ab7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:19:52 -0700 Subject: [PATCH 39/95] Fix Portuguese (pt.yml) locale: translate untranslated strings, fix broken tags and wrong translations - Translate untranslated English sections: maxsize command, SPAWN_PROTECTION flag - Fix ~30 broken legacy color codes (&uma, &um, & c, etc.) replaced with proper MiniMessage tags - Fix conversation-prefix containing AI response, set to '>' - Fix wrong translations: "Danos no peito" -> "Dano em baus" (chest damage), "Modo" -> "Moderador" (mod rank), "Estudando" -> "Aglomeracao" (CRAMMING), "Ataque da multidao" -> "Ataque de entidade" (ENTITY_ATTACK), "digitando" -> "entrando em" (now-entering), "Toxico" -> "Veneno" (POISON) - Fix now-leaving-your-island showing "entering" instead of "leaving" - Fix player-unbanned message saying "banido" (banned) instead of "desbanido" - Fix typos: "BConstruindo" -> "Construindo", "seconds" -> "segundos" - Fix stray ": c" in none-invited-you message - Fix panel flag-item layouts (name-layout, description-layout, menu-layout, setting-layout) with corrupted [description]/[name] placeholders - Fix compatibility state descriptions with broken version lines - Fix [versao] placeholder to [version] to match expected placeholder name Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/pt.yml | 182 +++++++++++++++--------------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/src/main/resources/locales/pt.yml b/src/main/resources/locales/pt.yml index 99fc05aad..1f1001233 100644 --- a/src/main/resources/locales/pt.yml +++ b/src/main/resources/locales/pt.yml @@ -169,8 +169,8 @@ commands: player-has: 'O jogador [name] tem [number] ilhas' duplicate-member: 'O jogador [name] é membro de mais de uma ilha no banco de dados' rank-on-island: '[rank] na ilha em [xyz]' - fixed: '&uma fixa' - done: '&uma digitalização' + fixed: 'Corrigido' + done: 'Verificação concluída' kick: parameters: description: expulse um jogador de um time @@ -192,10 +192,10 @@ commands: Aviso: este jogador agora possui [number] ilhas. Isso é mais do que o permitido pelas configurações ou permissões: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Define o tamanho máximo de equipe para a [prefix_island] de um jogador (use 0 para redefinir para o padrão do mundo) + success: 'Definido o tamanho máximo de equipe da [prefix_island] de [name] para [number].' + reset: 'Redefinido o tamanho máximo de equipe da [prefix_island] de [name] para o padrão do mundo ([number]).' range: description: comando de intervalo da ilha de administração invalid-value: @@ -288,7 +288,7 @@ commands: protection-coords: 'Coordenadas de Proteção: [xz1] até [xz2]' is-spawn: Ilha é uma ilha de spawn banned-players: 'Jogadores banidos:' - banned-format: '& c [name]' + banned-format: '[name]' unowned: 'Sem dono' bundle: 'Pacote de Blueprint usado para criar a ilha: [name]' switch: @@ -490,7 +490,7 @@ commands: Alguns caracteres foram removidos porque não são permitidos. O novo ID será [name]. success: Sucesso! - conversation-prefix: Sure! Please provide the text you would like me to translate. + conversation-prefix: '>' description: quit: desistir instructions: | @@ -692,8 +692,8 @@ commands: Membros da equipe não podem criar ilhas no mesmo mundo que sua equipe [prefix_island]. pasting: - estimated-time: 'Tempo estimado: [number] seconds.' - blocks: 'BConstruindo bloco por bloco: [number] blocos em todos...' + estimated-time: 'Tempo estimado: [number] segundos.' + blocks: 'Construindo bloco por bloco: [number] blocos no total...' entities: 'Preenchendo com entidades: [number] entidades em todas...' dimension-done: 'Ilha em [mundo] é construída.' done: 'Concluído! Sua ilha está pronta e esperando por você!' @@ -898,7 +898,7 @@ commands: cannot-invite-self: 'Você não pode se convidar!' cooldown: 'Você não pode convidar essa pessoa por mais [number] segundos.' island-is-full: 'Sua ilha está cheia, você não pode convidar mais ninguém.' - none-invited-you: 'Ninguém convidou você: c.' + none-invited-you: 'Ninguém convidou você.' you-already-are-in-team: 'Você já está em uma equipe!' already-on-team: 'Esse jogador já está em um time!' invalid-invite: 'Esse convite não é mais válido, desculpe.' @@ -982,8 +982,8 @@ commands: parameters: cannot-unban-yourself: 'Você não pode se desbanir!' player-not-banned: 'O jogador não está banido.' - player-unbanned: '[name]agora foi banido da sua ilha.' - you-are-unbanned: '[name]retirou você da ilha deles!' + player-unbanned: '[name] agora foi desbanido da sua ilha.' + you-are-unbanned: '[name] retirou seu banimento da ilha deles!' banlist: description: listar jogadores banidos noone: 'Ninguém está proibido nesta ilha.' @@ -1020,7 +1020,7 @@ ranks: visitor: Visitante banned: Banido admin: Administrador - mod: Modo + mod: Moderador protection: command-is-banned: Comando é proibido para visitantes flags: @@ -1119,12 +1119,12 @@ protection: description: |- Alternar interação com todos os contêineres. Inclui: barril, colmeia de abelhas, suporte de cerveja, - e um baú, compostor, dispensador, conta-gotas, - e um vaso de flores, fornalha, funil, moldura de item, - & uma jukebox, baú de minecart, caixa shulker, - & um baú preso. + baú, compostor, dispensador, conta-gotas, + vaso de flores, fornalha, funil, moldura de item, + jukebox, baú de minecart, caixa shulker, + baú preso. - Alterar substituições de configurações individuais + Alterar configurações individuais substitui esta bandeira. hint: Acesso ao contêiner desativado CHEST: @@ -1202,8 +1202,8 @@ protection: description: Alternar interação do funil hint: Interação do Hopper desativada CHEST_DAMAGE: - description: Alternar dano no peito causado por explosões - name: Danos no peito + description: Alternar dano em baús causado por explosões + name: Dano em baús CHORUS_FRUIT: description: Alternar teletransporte name: Frutas do refrão @@ -1211,9 +1211,9 @@ protection: CLEAN_SUPER_FLAT: description: |- Ative para limpar qualquer - e pedaços super planos em - &um mundo insular - name: Limpo Super Plano + pedaço super plano em + mundos de [prefix_island] + name: Limpar Super Plano COARSE_DIRT_TILLING: description: |- Alternar cultivo grosso @@ -1248,16 +1248,16 @@ protection: hint: Acesso ao ambiente de trabalho desativado CREEPER_DAMAGE: description: | - Alternar trepadeira - & uma proteção contra danos - name: Proteção contra danos à trepadeira + Alternar dano de + creeper. + name: Dano de creeper CREEPER_GRIEFING: description: | - Alternar o luto da trepadeira - &uma proteção quando aceso - pelo visitante da ilha. - name: Proteção contra o luto da trepadeira - hint: Creeper de luto desativado + Alternar proteção contra griefing + de creeper quando aceso + por visitante da [prefix_island]. + name: Proteção contra griefing de creeper + hint: Griefing de creeper desativado CROP_PLANTING: description: 'Defina quem pode plantar sementes.' name: Plantio de culturas @@ -1296,10 +1296,10 @@ protection: hint: Os baús Ender estão desativados neste mundo ENDERMAN_DEATH_DROP: description: |- - Endermen cairá - qualquer bloco que eles sejam - & uma propriedade se for morto. - name: Queda mortal de Enderman + Endermen soltarão + qualquer bloco que estejam + segurando se forem mortos. + name: Drop de morte de Enderman ENDERMAN_GRIEFING: description: |- Endermen pode remover @@ -1318,10 +1318,10 @@ protection: description: Exibir mensagens de entrada e saída island: ilha de [name] name: Mensagens de entrada/saída - now-entering: 'Agora digitando [name].' + now-entering: 'Agora entrando em [name].' now-entering-your-island: 'Agora entrando na sua ilha: [name]' now-leaving: 'Agora saindo da ilha de [name].' - now-leaving-your-island: 'Agora entrando na sua ilha: [name]' + now-leaving-your-island: 'Agora saindo da sua [prefix_island]: [name]' EXPERIENCE_BOTTLE_THROWING: name: Experimente jogar garrafas description: Alternar garrafas de experiência de lançamento. @@ -1366,15 +1366,15 @@ protection: hint: Uso do portão desabilitado GEO_LIMIT_MOBS: description: |- - Remova mobs que vão - parte externa protegida - &um espaço de ilha - name: 'Limitar mobs à ilha' + Remover mobs que saem + do espaço protegido + da [prefix_island] + name: 'Limitar mobs à [prefix_island]' HARVEST: description: |- Definir quem pode colher colheitas. - Não se esqueça de permitir o item - e uma picape também! + Não se esqueça de permitir a coleta + de itens também! name: Colheita hint: Colheita desativada HIVE: @@ -1408,8 +1408,8 @@ protection: ITEM_FRAME_DAMAGE: description: |- Mobs podem danificar - &um quadro de item - name: Danos na estrutura do item + molduras de item + name: Dano em moldura de item INVINCIBLE_VISITORS: description: |- Configurar visitante invencível @@ -1456,8 +1456,8 @@ protection: LIMIT_MOBS: description: |- Limitar entidades de - desova neste jogo - &um modo. + desova neste modo + de jogo. name: 'Limitar geração de tipo de entidade' can: 'Pode gerar' cannot: 'Não é possível gerar' @@ -1468,7 +1468,7 @@ protection: da faixa de proteção da ilha. Desativá-lo ajuda a evitar lava e água geração de paralelepípedos na área entre - e duas ilhas. + duas ilhas. Observe que os líquidos ainda fluirão verticalmente. Eles também não se espalharão horizontalmente se @@ -1480,8 +1480,8 @@ protection: CHANGE_SETTINGS: name: Mudar configurações description: |- - Permitir mudar qual membro - &uma função pode alterar as configurações da ilha. + Permitir mudar qual função de + membro pode alterar as configurações da [prefix_island]. MILKING: description: Alternar ordenha de vaca name: Ordenha @@ -1558,10 +1558,10 @@ protection: name: Redstone off-line PETS_STAY_AT_HOME: description: |- - Quando ativos, animais de estimação domesticados - só pode ir para e - não pode sair do proprietário - & uma ilha natal. + Quando ativo, animais domesticados + só podem ir para e + não podem sair da [prefix_island] + natal do proprietário. name: Animais de estimação ficam em casa PISTON_PUSH: description: |- @@ -1634,10 +1634,10 @@ protection: hint: Interação Redstone desativada REMOVE_END_EXIT_ISLAND: description: |- - Impede a saída final - &uma ilha de gerar + Impede a [prefix_island] de + saída final de gerar nas coordenadas 0,0 - name: Remover ilha de saída final + name: Remover [prefix_island] de saída final REMOVE_MOBS: description: |- Remova monstros quando @@ -1665,15 +1665,15 @@ protection: permitido SCULK_SENSOR: description: |- - Alterna o sensor de escultura - &uma ativação. - name: Sensor de escultura + Alterna a ativação do + sensor sculk. + name: Sensor Sculk hint: a ativação do sensor sculk está desativada SCULK_SHRIEKER: description: |- - Alterna o grito do sculk - &uma ativação. - name: Sculk Gritador + Alterna a ativação do + sculk shrieker. + name: Sculk Shrieker hint: a ativação do sculk shrieker está desativada SIGN_EDITING: description: |- @@ -1741,12 +1741,12 @@ protection: Membros da Ilha ainda perdem seus itens se eles morrerem em sua própria ilha! SPAWN_PROTECTION: - name: Spawn island void protection + name: Proteção contra o vazio na ilha de spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Quando ativado, jogadores que caem + no vazio na ilha de spawn + serão teletransportados de volta ao + ponto de spawn em vez de morrer. RAID_TRIGGER: name: Gatilho de ataque description: Define o nível mínimo de ilha necessário para desencadear um ataque @@ -1804,7 +1804,7 @@ protection: name: 'Redefinir para o padrão' description: | Redefine TODOS as configurações para seus - &um valor padrão. + valor padrão. confirm: confirmar instructions: 'Você tem certeza? Digite "confirmar" para redefinir tudo.' PROTECTION: @@ -1824,9 +1824,9 @@ protection: title: '[nome_do_mundo] Proteções mundiais' description: | Configurações de proteção quando - &um jogador está fora de sua ilha + jogador está fora de sua [prefix_island] flag-item: - name-layout: '&um nome]' + name-layout: '[name]' command-instructions: setname: |- Selecione a classificação que pode @@ -1880,22 +1880,22 @@ protection: Selecione a classificação que pode usar o comando de borda description-layout: | - &Uma descrição] + [description] - Clique com o botão esquerdo em para descer. - Clique com o botão direito em para avançar. + Clique com o botão esquerdo para descer. + Clique com o botão direito para avançar. Permitido para: allowed-rank: '- [rank]' blocked-rank: '- [rank]' minimal-rank: '- [rank]' menu-layout: | - &Uma descrição] + [description] Clique em para abrir. setting-cooldown: 'A configuração está em espera' setting-layout: | - &Uma descrição] + [description] Clique em para alternar. @@ -1941,39 +1941,39 @@ management: name: 'Compatibilidade' description: COMPATIBLE: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um COMPATÍVEL software de servidor e - &uma versão. + versão. Seus recursos são totalmente projetados para - executado neste ambiente. + executar neste ambiente. SUPPORTED: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um SUPORTADO software de servidor e - &uma versão. + versão. A maioria de seus recursos funcionará perfeitamente neste ambiente. NOT_SUPPORTED: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um NÃO SUPORTADO software de servidor ou - &uma versão. + versão. Embora a maioria de seus recursos sejam executados corretamente, bugs específicos da plataforma ou problemas são esperados. INCOMPATIBLE: | - Executando [name] [versão]. + Executando [name] [version]. BentoBox está atualmente rodando em um INCOMPATÍVEL software de servidor ou - &uma versão. + versão. Comportamentos estranhos e bugs podem ocorrer e a maioria dos recursos pode ser instável. @@ -2002,7 +2002,7 @@ catalog: [descrição] Clique em para obter o link para o - e um lançamento mais recente. + lançamento mais recente. already-installed: Já instalado! install-now: Instale agora! empty-here: @@ -2015,7 +2015,7 @@ catalog: enums: DamageCause: CONTACT: Contato - ENTITY_ATTACK: Ataque da multidão + ENTITY_ATTACK: Ataque de entidade ENTITY_SWEEP_ATTACK: Ataque de varredura PROJECTILE: Projétil SUFFOCATION: Asfixia @@ -2031,16 +2031,16 @@ enums: LIGHTNING: Raio SUICIDE: Suicídio STARVATION: Inanição - POISON: Tóxico + POISON: Veneno MAGIC: Magia WITHER: Murchar FALLING_BLOCK: Bloco caindo THORNS: Espinhos DRAGON_BREATH: Bafo de dragão CUSTOM: Personalizado - FLY_INTO_WALL: Voe para dentro da parede + FLY_INTO_WALL: Voou contra a parede HOT_FLOOR: Piso Quente - CRAMMING: Estudando + CRAMMING: Aglomeração DRYOUT: Secar FREEZE: Congelar KILL: Matar From 66827414c27f723e0b978ef5e49ea1f9a67f793e Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:20:13 -0700 Subject: [PATCH 40/95] Fix Simplified Chinese (zh-CN.yml) locale: translate untranslated strings and fix errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (was entirely English) - Translate SPAWN_PROTECTION flag name and description (was entirely English) - Translate CRAFTER flag (was partially English: "Crafter访问禁用") - Translate "Placeholder Browser" panel title - Fix broken legacy color code: '&' prefix in setprotectionlocation confirmation - Fix broken placeholder: [&prefix_island] -> [prefix_island] in tpuser - Fix wrong translation: not-in-team said "在" (is in) instead of "不在" (is not in) - Fix typo: "的都信息" -> "的岛屿信息" in admin info description - Fix mistranslation: "奖金" (bonus money) -> "奖励" (bonus) for protection range bonus - Fix '&退出' -> "'退出'" in blueprint name prompt and description instructions - Clean up empty tag in blueprint sink status Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/zh-CN.yml | 39 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/resources/locales/zh-CN.yml b/src/main/resources/locales/zh-CN.yml index 49c21c0de..2f08bcb2c 100644 --- a/src/main/resources/locales/zh-CN.yml +++ b/src/main/resources/locales/zh-CN.yml @@ -32,7 +32,7 @@ general: no-safe-location-found: '试图将你传送到岛屿上时找不到安全的落脚点.' not-owner: '你不是这座岛屿的岛主!' player-is-not-owner: '[name]不是这座岛屿的岛主!' - not-in-team: '该玩家在你的团队中!' + not-in-team: '该玩家不在你的团队中!' offline-player: '该玩家已离线或不存在.' unknown-player: '未知玩家: [name]!' general: '该命令尚未就绪 - 请联系管理员' @@ -169,9 +169,9 @@ commands: extra-islands: '警告: 该玩家当前拥有[number]个岛屿, 最多仅可以拥有[max]个岛屿.' maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: 设置玩家的 [prefix_island] 最大团队人数 (使用 0 重置为世界默认值) + success: '已将[name]的 [prefix_island] 最大团队人数设置为 [number].' + reset: '已将[name]的 [prefix_island] 最大团队人数重置为世界默认值 ([number]).' range: description: 岛屿保护范围管理员命令 invalid-value: @@ -226,7 +226,7 @@ commands: player-has-more-than-one-island: '玩家拥有多个岛屿, 请指定一个岛屿.' info: parameters: <玩家> - description: 获取当前岛屿或指定玩家的都信息 + description: 获取当前岛屿或指定玩家的岛屿信息 no-island: '你当前没有岛屿...' title: '========== 岛屿信息 ============' island-uuid: 'UUID: [uuid]' @@ -248,7 +248,7 @@ commands: islands-in-trash: '岛屿在垃圾桶中.' protection-range: '岛屿保护范围: [range]' protection-range-bonus-title: '包含以下奖励:' - protection-range-bonus: '奖金: [number]' + protection-range-bonus: '奖励: [number]' purge-protected: '岛屿处于清理保护状态' max-protection-range: '历史最大保护范围: [range]' protection-coords: '岛屿保护界线: [xz1] 至 [xz2]' @@ -303,7 +303,7 @@ commands: manual: '没有找到安全的落脚点! 请手动传送至[location]附近检查原因.' tpuser: parameters: <传送玩家> <[prefix_island]的玩家> [玩家的岛] - description: 将玩家传送到另一个玩家的 [&prefix_island] + description: 将玩家传送到另一个玩家的 [prefix_island] getrank: parameters: [island owner] description: 获取指定玩家的身份等级 @@ -318,7 +318,7 @@ commands: parameters: '[x y z coords]' description: 将当前位置或指定坐标作为岛屿保护的中心点 island: '这将影响玩家[name]位于[xyz]的岛屿.' - confirmation: '&你确定要将[xyz]设置为当前岛屿保护的中心点吗?' + confirmation: '你确定要将[xyz]设置为当前岛屿保护的中心点吗?' success: '成功将[xyz]设置为当前岛屿保护的中心点.' fail: |- 未能将[xyz]设置为当前岛屿保护的中心点! @@ -366,7 +366,7 @@ commands: description: 复制两个选取点所示区域内的所有非空气方块(如果有[air]参数则包含空气方块) sink: description: 将此蓝图设置为粘贴时沉入海底。 - status: '蓝图会在粘贴时 [status] ' + status: '蓝图会在粘贴时 [status]' sink: '沉没' not-sink: '不下沉' no-clipboard: '剪贴板中没有蓝图。加载或复制一些东西。' @@ -437,7 +437,7 @@ commands: 它将出现在玩家创建岛屿界面中 name: quit: 退出 - prompt: 请输入蓝图方案名称, 或输入&退出取消创建蓝图方案 + prompt: 请输入蓝图方案名称, 或输入'退出'取消创建蓝图方案 too-long: '蓝图方案名称过长, 请确保在32个字符以内.' pick-a-unique-name: '该蓝图方案名称已存在, 请换一个名称.' stripped-char-in-unique-name: '其中的非法字符已被删除, 岛屿方案名称为: [name].' @@ -448,7 +448,7 @@ commands: instructions: |- 请为[name]蓝图方案输入描述 每输入一次为一行 - 最后输入&退出退出编辑 + 最后输入'退出'退出编辑 default-color: '' success: '蓝图方案描述添加成功!' cancelling: '取消编辑蓝图方案描述!' @@ -1051,9 +1051,9 @@ protection: description: '允许禁止打开木桶' hint: 禁止打开木桶 CRAFTER: - name: 手工艺者 - description: 切换使用 - hint: Crafter访问禁用 + name: 合成器 + description: 切换合成器的使用 + hint: 禁止使用合成器 BLOCK_EXPLODE_DAMAGE: description: '允许禁止床与重生锚破坏方块和对实体造成伤害' name: '爆炸伤害与破坏' @@ -1569,12 +1569,11 @@ protection: 禁止时: 玩家在他人岛屿死亡掉落 岛屿成员在自己的岛屿上死亡时仍然会掉落物品和经验 SPAWN_PROTECTION: - name: Spawn island void protection + name: 出生岛虚空保护 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 启用后, 在出生岛掉入虚空的 + 玩家将被传送回出生点, + 而不会死亡. RAID_TRIGGER: name: 触发袭击 description: 设置触发袭击所需的岛屿最低等级 @@ -1861,7 +1860,7 @@ panels: author: '- [name]' selected: '当前已选择该语言' placeholder: - title: 'Placeholder Browser' + title: '占位符浏览器' buttons: bentobox: name: 'BentoBox' From 98a999d1802b7b73bf0cb0489f3a613577533cab Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:20:29 -0700 Subject: [PATCH 41/95] Fix Latvian (lv.yml) locale: translate untranslated strings and fix wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section from English to Latvian - Translate SPAWN_PROTECTION flag from English to Latvian - Fix DamageCause enums: CONTACT (was "Contact us"), FALL (was "Autumn"), VOID (was gibberish AI text), DRAGON_BREATH (was "Horse Breath"), FLY_INTO_WALL (imperative form), FREEZE (was food freezing), KILL (was imperative), SONIC_BOOM (was "bloom"), CRAMMING, DRYOUT, SUFFOCATION, POISON, ENTITY_SWEEP_ATTACK, and others - Fix TRAPPED_CHEST (was "imprisoned furnaces" / "cups") - Fix CANDLES hint (was "sandwiches") - Fix CRAFTER hint (was offensive "invalīda") - Fix WITHER_DAMAGE name (was just "Toggle") - Fix PVP_NETHER messages (was "Netherlands" instead of Nether/Elles) - Fix PVP_END typo "Biegu" -> "Beigu" - Fix Frost Walker (was "Island Walker" - sala vs sals) - Fix FLINT_AND_STEEL (was "Karms" - wrong word) - Fix HURT_TAMED_ANIMALS name/hint - Fix HURT_VILLAGERS duplicate word in hint - Fix garbled language parameter [lвек] -> [valoda] - Fix untranslated "Type" in purge regions confirm - Fix sink translation (was "kitchen sink") - Fix various typos: veiskmīgi, pieveinots, neveinas, skatitam, satusu, mēgīni, Pārslaigāt, Pārlēgt, tirogties, blokkus - Fix Axolotl hint (was "melting") Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/lv.yml | 165 +++++++++++++++--------------- 1 file changed, 80 insertions(+), 85 deletions(-) diff --git a/src/main/resources/locales/lv.yml b/src/main/resources/locales/lv.yml index 76e023080..07ac0420f 100644 --- a/src/main/resources/locales/lv.yml +++ b/src/main/resources/locales/lv.yml @@ -12,7 +12,7 @@ prefixes: islands: saliņas general: success: 'Darīts!' - invalid: Nederīgs + invalid: Nederīgs! beta: 'Šī komanda ir beta versijā. Pārliecinieties, ka jums ir dublējumi!' errors: command-cancelled: 'Komanda atcleta.' @@ -116,15 +116,15 @@ commands: scanning-in-progress: 'Skenēšana notiek, lūdzu, gaidiet' none-found: 'Nav atrastas salas, kuras varētu izdzēst.' total-islands: 'Jums ir [number] salas jūsu datu bāzē visās pasaulēs.' - number-error: 'Parametram ir jābūt dienu skatitam.' + number-error: 'Parametram ir jābūt dienu skaitam.' confirm: 'Raksti [label] purge confirm, lai sāktu dzēšanu' completed: 'Dzēšana pabeigta.' - see-console-for-status: Dzēšana uzsākta. Skati terminālī, lai redzētu satusu. + see-console-for-status: Dzēšana uzsākta. Skati terminālī, lai redzētu statusu. no-purge-in-progress: 'Šobrīd nav nevienas tīrīšanas procedūras.' regions: parameters: '[days]' description: Iztīrīt salas, izdzēšot veco reģiona failus - confirm: 'Type /[label] purge regions confirm, lai sāktu attīrīt' + confirm: 'Ievadi /[label] purge regions confirm, lai sāktu attīrīt' protect: description: Pārslēgt salas aizsargāšanu no dzēšanas move-to-island: 'Sākumā pārvietojies uz salas!' @@ -148,7 +148,7 @@ commands: description: pievieno spēlētāju īpašnieka salai name-not-owner: '[name] nav salas īpašnieks.' name-has-island: '[name] jau pieder kāda sala. Atreģistrē vai izdzēs to vispirms!' - success: '[name]ir pieveinots [owner]salai.' + success: '[name] ir pievienots [owner] salai.' disband: parameters: <īpašnieks> description: izformē īpašnieka komandu @@ -187,10 +187,10 @@ commands: Brīdinājums: šim spēlētājam tagad pieder [number] salas. Tas ir vairāk nekā atļautais limits pēc iestatījumiem vai atļaujām: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Iestatīt maksimālo komandas izmēru spēlētāja [prefix_island] (izmantojiet 0, lai atiestatītu uz pasaules noklusējumu) + success: 'Iestatīts [name] [prefix_island] maksimālais komandas izmērs uz [number].' + reset: 'Atiestatīts [name] [prefix_island] maksimālais komandas izmērs uz pasaules noklusējumu ([number]).' range: description: Admina salas distances komanda invalid-value: @@ -304,7 +304,7 @@ commands: Numuram jābūt starp 1 un [number]. Lieto [label] trash [player], lai redzētu salas numuru cannot-switch: 'Pārslēgšana neizdevās! Skaties kļūdu paziņojumu konsulē.' - success: 'Spēlētāja sala veiskmīgi pārslēgta uz uzstādīto numuru.' + success: 'Spēlētāja sala veiksmīgi pārslēgta uz uzstādīto numuru.' trash: no-unowned-in-trash: 'Nav salas atkritnē bez īpašniekiem' no-islands-in-trash: 'Spēlētājam nav salas atkritnē' @@ -369,7 +369,7 @@ commands: setspawn: description: uzstāda kā sākuma salu šajā pasaulē visiem spēlētājiem already-spawn: 'Šī sala jau ir uzstādīta kā sākuma sala!' - no-island-here: 'Šeit nav neveinas salas.' + no-island-here: 'Šeit nav nevienas salas.' confirmation: 'Vai tiešām vēlies uzstādīt šo salu kā sākuma salu?' success: 'Šī sala ir veiksmīgi uzstādīta kā sākuma sala šajā pasaulē.' setspawnpoint: @@ -414,8 +414,8 @@ commands: iestatiet šo plānu, lai tas iegremdētos okeāna dibenā, kad tas tiek ielikt. status: 'Zīmējums būs [status] , kad to ieliks.' - sink: 'izlietne' - not-sink: 'neiegrimst' + sink: 'iegremdēts' + not-sink: 'neiegremdēts' no-clipboard: 'Klipbordā nav nevienas plāna. Ielādējiet vai kopējiet kaut ko.' delete: parameters: @@ -595,7 +595,7 @@ commands: reload: description: parlādēt iestatījumus, papildinājumus (ja atbalstīts) un valodas locales-reloaded: 'Valodas faili pārlādēti.' - addons-reloaded: 'Papildinājumu pārlādēti.' + addons-reloaded: 'Papildinājumi pārlādēti.' settings-reloaded: 'Iestatījumi pārlādēti.' addon: 'Pārlādē [name].' addon-reloaded: '[name] pārlādēts.' @@ -985,7 +985,7 @@ commands: description: attaino salas iestatījumus language: description: valodu izvēle - parameters: '[lвек]' + parameters: '[valoda]' not-available: 'Šī valoda nav pieejama.' already-selected: 'Jūs jau izmantojat šo valodu.' expel: @@ -1034,9 +1034,9 @@ protection: name: Bruņu statīvi hint: Bruņu statīva lietošana atslēgta AXOLOTL_SCOOPING: - name: Axolotl izsistīšana + name: Axolotl izsmelšana description: Atļaut axolotlu izņemšanu ar spaini - hint: Axolotl kausēšana atspējota + hint: Axolotl izsmelšana atspējota BEACON: description: Pārslēdz izmantošanu name: Signāluguņi @@ -1092,16 +1092,16 @@ protection: name: Pogas hint: Pogu spiešana nav atļauta CANDLES: - description: Pārlēgt sveču mijiedarbību + description: Pārslēgt sveču mijiedarbību name: Svecītes - hint: Sviestmaizīšu mijiedarbība atslēgta + hint: Sveču mijiedarbība atslēgta CAKE: description: Pārslēdz iespēju ēst kūkas name: Kūkas hint: Kūku ēšana nav atļauta CARTOGRAPHY: name: Kartogrāfijas galdi - description: Pārslaigāt lietošanu + description: Pārslēgt lietošanu hint: Kartogrāfijas galda piekļuve atspējota CONTAINER: name: Kontaineri @@ -1113,7 +1113,7 @@ protection: ar citiem karogiem. hint: Konteineru atvēršana nav atļauta CHEST: - name: Lādēm un vagona lādēm + name: Lādes un vagona lādes description: |- Pārslēgt mijiedarbību ar lādzēm un lādes vilcieniem. @@ -1126,13 +1126,13 @@ protection: CRAFTER: name: Amatnieks description: Pārslēgt lietošanu - hint: Amatnieks invalīda + hint: Amatnieka lietošana atspējota BLOCK_EXPLODE_DAMAGE: description: |- Atļaut gultām & atkārtotas atdzimšanas enkuriem sagraut blokos un nodarīt bojājumus entītijām. - name: Bloku sprādziena bojājumu + name: Bloku sprādziena bojājumi COMPOSTER: name: Komposteri description: Pārslēgt kompostera mijiedarbību @@ -1140,24 +1140,24 @@ protection: LOOM: name: Stelles description: Pārslēgt lietošanu - hint: Loom piekļuve atspējota + hint: Stellu piekļuve atspējota FLOWER_POT: name: Ziedu podi description: Pārslēgt puķu poda mijiedarbību hint: Zieda poda mijiedarbība atspējota GRINDSTONE: - name: Sasmalcināšana + name: Galantiņš description: Pārslēgt lietošanu - hint: Grindstone piekļuve atslēgta + hint: Galantiņa piekļuve atslēgta SHULKER_BOX: name: Shulker kastes description: Pārslēgt shulker kastes mijiedarbību hint: Shulker kastes piekļuve atslēgta SHULKER_TELEPORT: description: |- - Šulker var teleports + Šulkeri var teleportēties ja ir aktīvs. - name: Shulker teleports + name: Šulkeru teleportācija SMITHING: name: Kalšana description: Pārslēgt lietošanu @@ -1167,9 +1167,9 @@ protection: description: Pārslēgt lietošanu hint: Akmensgriezuma piekļuve ir atspējota TRAPPED_CHEST: - name: Ieslodzītās krāsnis - description: Pārslēgt slēgtās krūzes mijiedarbību - hint: Ieslēgta slēgtā krūze piekļuve atslēgta + name: Slazdotās lādes + description: Pārslēgt slazdoto lāžu mijiedarbību + hint: Slazdoto lāžu piekļuve atslēgta DISPENSER: name: Izšāvēji description: Pārslēdz izšāvēju izmantošanu @@ -1333,12 +1333,12 @@ protection: description: Pārslēdz iespēju zivis iesmelt spaiņos hint: Zivju iesmelšana nav atļauta FLINT_AND_STEEL: - name: Karms un dzelzs + name: Šķiltavas un tērauds description: |- Ļauj spēlētājiem aizdedzināt - uguni izmantojot karmu un - dzelzi vai ugunsbumbas. - hint: Karma un dzelzs un ugunsbumbas lietošana nav atļauta + uguni izmantojot šķiltavas un + tēraudu vai ugunsbumbas. + hint: Šķiltavu un tērauda un ugunsbumbu lietošana nav atļauta FURNACE: description: Pārslēdz iespēju lietot krāsnis name: Krāsns @@ -1368,8 +1368,8 @@ protection: description: >- Pārslēgt sāpju radīšanu. Ieslēgts nozīmē, ka pieradināti dzīvnieki var gūt bojājumus. Izslēgts nozīmē, ka tie ir neaizskarami. - name: Sist tame dzīvniekus - hint: Apturēt tāmēto dzīvnieku ievainojumus + name: Sist pieradinātos dzīvniekus + hint: Pieradināto dzīvnieku ievainošana nav atļauta HURT_ANIMALS: description: Pārslēdz iespēju ievainot dzīvniekus name: Ievainot dzīvniekus @@ -1383,7 +1383,7 @@ protection: Pārslēdz iespēju ievainot ciemata iedzīvotājus name: Ievainot ciematniekus - hint: Ciemata ievainošana ievainošana nav atļauta + hint: Ciematnieku ievainošana nav atļauta ITEM_FRAME: name: Priekšmetu rāmis description: |- @@ -1594,7 +1594,7 @@ protection: Ieslēgt/Izslēgt spēlētājs pret spēlētāja režīmu (PVP) Beigu pasaulē. - name: Biegu pasaules PVP + name: Beigu pasaules PVP hint: 'Spēlētājs nevar izdarīt bojājumus citam spēlētājam Beigu pasaulē' enabled: 'PVP Endā ir ieslēgts.' disabled: 'PVP Beigās ir atspējots.' @@ -1605,8 +1605,8 @@ protection: Ellē. name: Elles PVP hint: 'Spēlētājs nevar izdarīt bojājumus citam spēlētājam Ellē' - enabled: 'PVP ir iespējots Nīderā.' - disabled: 'PVP Nīderlandē ir atspējots.' + enabled: 'PVP Ellē ir iespējots.' + disabled: 'PVP Ellē ir atspējots.' PVP_OVERWORLD: description: |- Ieslēgt/Izslēgt spēlētājs @@ -1614,7 +1614,7 @@ protection: Virszemē. name: Virszemes PVP hint: 'Spēlētājs nevar izdarīt bojājumus citam spēlētājam Virszemē' - enabled: 'PVP Pārējo pasaulē ir ieslēgts.' + enabled: 'PVP Virszemē ir ieslēgts.' disabled: 'PVP Pasaulē ir atspējots.' REDSTONE: description: |- @@ -1693,7 +1693,7 @@ protection: hint: Aizdedzināt dinamītu nav atļauts TRADING: description: |- - Pārslēdz iespēju tirogties + Pārslēdz iespēju tirgoties ar ciemata iedzīvotājiem. name: Tirgošanās hint: Tirgošanās ar ciemata iedzīvotājiem nav atļauta @@ -1720,9 +1720,9 @@ protection: FROST_WALKER: description: |- Pārslēdz iespēju izmantot - sala staigātāja maģiju. - name: Sala staigātājs - hint: Sala staigātājs šeit nav atļauts + sals staigātāja maģiju. + name: Sals staigātājs + hint: Sals staigātājs šeit nav atļauts EXPERIENCE_PICKUP: name: Pieredzes savākšana description: |- @@ -1745,12 +1745,12 @@ protection: [prefix_Island] dalībnieki joprojām zaudē savus priekšmetus , ja viņi mirst savā [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Sākuma salas tukšuma aizsardzība description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Kad iespējots, spēlētāji, kas iekrīt + tukšumā sākuma salā, tiks + teleportēti atpakaļ uz sākuma + punktu, nevis mirs. RAID_TRIGGER: name: Iebrukuma aktivizēšana description: Iestata minimālo salas rangu, kas nepieciešams iebrukuma aktivizēšanai @@ -1769,20 +1769,20 @@ protection: izmantot vēja lādiņus šajā salā. hint: Vēja lādiņu izmantošana atspējota WITHER_DAMAGE: - name: Pārslēgt + name: Wither bojājumi description: |- - Ļauj katlem saplēst blokus + Ļauj Wither saplēst blokus un bojāt radības. WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Atļaut gultas & respawn enkuriem - iznīcināt blokķus un nodarīt + iznīcināt blokus un nodarīt bojājumus entitātēm ārpus [prefix_island] robežām. name: Pasaules bloka sprādziena bojājumi WORLD_TNT_DAMAGE: description: |- Atļaut TNT un TNT raktuvju - lauzt blokkus un nodarīt + lauzt blokus un nodarīt ievainojumus ārpus [prefix_island] robežām. name: Pasaule TNT kaitējums locked: 'Šī sala ir slēgta!' @@ -2016,42 +2016,37 @@ catalog: uzstādījumos vai arī mēģini vēlāk. enums: DamageCause: - CONTACT: Sazinieties - ENTITY_ATTACK: Mob uzbrukums - ENTITY_SWEEP_ATTACK: Sviestspēks uzbrukums - PROJECTILE: Izšautne - SUFFOCATION: Saspiestība - FALL: Rudens + CONTACT: Saskare + ENTITY_ATTACK: Radības uzbrukums + ENTITY_SWEEP_ATTACK: Vēziena uzbrukums + PROJECTILE: Šāviņš + SUFFOCATION: Nosmakšana + FALL: Kritiens FIRE: Uguns - FIRE_TICK: Dedzināšana - MELTING: Kusšana + FIRE_TICK: Degšana + MELTING: Kušana LAVA: Lava - DROWNING: Dziļūdens noslīkšana - BLOCK_EXPLOSION: Bloka Sprādziens - ENTITY_EXPLOSION: Entitātes sprādziens - VOID: >- - Izsistā vārtu stāvoklis: [state] \n\nFakts, ka spēlētājs ir izdzēsis savu - pasauli, atspoguļo [player] lēmumu. \n\nNekas vairs netika izdzēsts, kad - tas atgriezās uz [world]. \n\nNezinu, kāpēc tas aizgāja uz [location], bet - tas ir [explanation]. \n\nTagad [player] atpūšas unn šajā [dimension] ir - viss, kas palicis. \n\nNekas cits, kā tikai tukšums (dzīvība). + DROWNING: Noslīkšana + BLOCK_EXPLOSION: Bloka sprādziens + ENTITY_EXPLOSION: Radības sprādziens + VOID: Tukšums LIGHTNING: Zibens SUICIDE: Pašnāvība STARVATION: Izsalkums - POISON: Indīgums - MAGIC: Burvība + POISON: Saindēšanās + MAGIC: Maģija WITHER: Wither - FALLING_BLOCK: Kritušais Bloks - THORNS: Dzeloni - DRAGON_BREATH: Zirgu Elpa + FALLING_BLOCK: Krītošs bloks + THORNS: Ērkšķi + DRAGON_BREATH: Pūķa elpa CUSTOM: Pielāgots - FLY_INTO_WALL: Lidojiet Pret Sienu - HOT_FLOOR: Karstā Grīda - CRAMMING: Cramming - DRYOUT: Sausušana - FREEZE: Saldēt - KILL: Nogalini - SONIC_BOOM: Skaņas uzplaukums + FLY_INTO_WALL: Ietriekšanās sienā + HOT_FLOOR: Karstā grīda + CRAMMING: Saspiešana + DRYOUT: Izžūšana + FREEZE: Apsalšana + KILL: Nogalināšana + SONIC_BOOM: Skaņas vilnis WORLD_BORDER: Pasaules robeža panel: credits: @@ -2066,7 +2061,7 @@ panel: šim papildinājumam. Ļauj BentoBox savienoties ar GitHub - konfigurācijā vai mēgīni vēlāk. + konfigurācijā vai mēģini vēlāk. panels: island_homes: title: 'Jūsu [prefix_island] mājas' From 4786c4477e875b53093b2ae4f24e1621570c3f44 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:20:30 -0700 Subject: [PATCH 42/95] Fix Russian (ru.yml) locale: translate untranslated strings, fix typos and broken formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section (was entirely English) - Translate SPAWN_PROTECTION flag (was entirely English) - Translate REMOVE_END_EXIT_ISLAND flag (was entirely English) - Translate Placeholder Browser panel title - Translate "Copper Golem" to "медный голем" - Fix broken legacy color codes: &б -> , &а -> - Fix broken tag: bsp;c -> proper text - Fix typos: Яйко->Яйцо, клинт->клик, сдеал->сделал, ИГрок->Игрок, НЕПОДДЕРЖИМЕМОЙ->НЕПОДДЕРЖИВАЕМОЙ, переключательно->переключатель, участников->участником - Fix wrong translations: рекламировать->повысить (promote), раковина->погружаться (sink), антрестить->убрать доверие (untrust), Зубрёжка->Давка (CRAMMING), Соник Бум->Звуковой удар (SONIC_BOOM) - Fix swapped messages in expel section - Fix uncoop success message (was untranslated English) - Fix already-on message (was copy of already-off) - Fix purge status "of" -> "из" - Fix "version." leftover in INCOMPATIBLE section - Remove erroneous [Конце] brackets - Fix DamageCause nouns: Заморозить->Замерзание, Убить->Убийство, Влететь в стену->Столкновение со стеной, Сушка->Высыхание Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ru.yml | 101 +++++++++++++++--------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index ab679c637..4254bd1aa 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -112,7 +112,7 @@ commands: Сканирование островов в базе данных. Это может занять некоторое время в зависимости от того, сколько у вас количество... scanning-in-progress: 'Сканирование в процессе, пожалуйста, подождите' - none-found: 'bsp;c Нет найдено островов для очищения.' + none-found: 'Не найдено островов для очистки.' total-islands: 'У вас [number] островов в вашей базе данных во всех мирах.' number-error: 'Значение должно быть количеством дней' confirm: 'Введите /[label] purge confirm для начала очистки.' @@ -123,7 +123,7 @@ commands: no-purge-in-progress: 'В данный момент очистка не проводится.' regions: parameters: '[days]' - description: oстрова чистки путем удаления файлов старого региона + description: очистка островов путём удаления старых файлов регионов confirm: 'Тип /[label] purge regions confirm чтобы начать чистку' protect: description: переключатель защиты острова от очистки @@ -131,7 +131,7 @@ commands: protecting: 'Остров защищен от очистки.' unprotecting: 'Защита от очистки убрана.' stop: - description: оставить проводящуюся очистку + description: остановить проводящуюся очистку stopping: Очистка остановлена unowned: description: позволяет очистить острова без владельцев @@ -139,7 +139,7 @@ commands: status: description: отображает статус очистки status: >- - [purged] остров очищено of [purgeable] ([percentage] + [purged] островов очищено из [purgeable] ([percentage] %). team: description: управление командой @@ -187,10 +187,10 @@ commands: Внимание: у этого игрока теперь есть [number] островов. Это больше, чем разрешено настройками или правами: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: <игрок> <размер> + description: установить максимальный размер команды для [prefix_island] игрока (0 для сброса к мировому значению по умолчанию) + success: 'Установлен максимальный размер команды [name] для [prefix_island] на [number].' + reset: 'Сброшен максимальный размер команды [name] для [prefix_island] до мирового значения по умолчанию ([number]).' range: description: команда администратора по управлению областью острова invalid-value: @@ -199,7 +199,7 @@ commands: same-as-before: 'Радиус острова уже установлен в значении [number]!' display: already-off: 'Индикаторы уже выключены' - already-on: 'Индикаторы уже выключены' + already-on: 'Индикаторы уже включены' description: показать/скрыть индикаторы размера острова hiding: 'Скрыть индикаторы размера острова' hint: >- @@ -283,7 +283,7 @@ commands: max-protection-range: 'Самый большой радиус острова за все время: [range]' protection-coords: 'Радиус границ острова: от [xz1] до [xz2]' is-spawn: Остров является точкой спавна - banned-players: 'Забанненые игроки:' + banned-players: 'Забаненные игроки:' banned-format: '[name]' unowned: 'Не владелец' bundle: 'Пакет чертежей, использованный для создания острова: [name]' @@ -413,8 +413,8 @@ commands: sink: description: установите этот чертеж, чтобы он опустился на дно океана после вставки status: 'Чертеж будет [status] при вставке' - sink: 'раковина' - not-sink: 'не тонуть' + sink: 'погружаться на дно' + not-sink: 'не погружаться' no-clipboard: 'В буфере обмена нет чертежа. Загрузите или скопируйте что-нибудь.' delete: parameters: @@ -463,7 +463,7 @@ commands: правильно для установки trash: Мусор no-trash: Не удается удалить в мусор - trash-instructions: Правый клинт для удаления + trash-instructions: Правый клик для удаления no-trash-instructions: Не удается удалить пакет по умолчанию permission: Разрешение no-permission: Нет разрешения @@ -750,7 +750,7 @@ commands: confirmation: 'Вы уверены, что хотите установить точку дома в Незере?' the-end: not-allowed: 'Вам не разрешено устанавливать точку дома в Энд.' - confirmation: 'Вы уверены, что хотите установить свой дом в [Конце]?' + confirmation: 'Вы уверены, что хотите установить свой дом в Энде?' parameters: '[имя дома]' setname: description: устанавливает название вашего острова @@ -839,7 +839,7 @@ commands: all-members-logged-off: >- Все участники острова вышли из сети, так что вы больше не находитесь в кооперации на острове игрока [name]. - success: '[name] is no longer a coop member of your island.' + success: '[name] больше не является участником кооперации на вашем острове.' is-full: 'Вы не можете больше добавлять в кооперацию.' trust: description: сделать игрока доверенным на острове @@ -847,7 +847,7 @@ commands: trust-in-yourself: 'Поверьте в себя!' name-has-invited-you: '[name] пригласил вас стать довереннным игроком на его острове.' player-already-trusted: 'Игрок уже доверенный!' - you-are-trusted: 'Игрок [name] сдеал вас доверенным!' + you-are-trusted: 'Игрок [name] сделал вас доверенным!' success: 'Вы сделали игрока [name] доверенным.' is-full: 'Вы не можете доверять еще кому-либо, лимит достигнут!' untrust: @@ -881,7 +881,7 @@ commands: enter-name: 'Введите имя:' tips: LEFT: - name: '&б Левый Клик' + name: 'Левый Клик' search: 'Введите имя игрока' back: 'Назад' invite: |- @@ -921,7 +921,7 @@ commands: description: отклонить ожидающие подтверждения приглашения посетить ваш остров leave: cannot-leave: >- - Владелец не может покинуть остров! Сначала станьте участников, или + Владелец не может покинуть остров! Сначала станьте участником, или удалите всех участников. description: покинуть свой остров left-your-island: '[name] покинул ваш остров' @@ -946,8 +946,8 @@ commands: description: повышает ранг игрока на вашем острове parameters: <игрок> errors: - cant-promote-yourself: 'Вы не можете рекламировать себя!' - cant-promote: 'Вы не можете понизить себя!' + cant-promote-yourself: 'Вы не можете повысить себя!' + cant-promote: 'Вы не можете повышать более высокие ранги!' must-be-member: 'Игрок должен быть членом [prefix_an-island]!' failure: 'Игрока нельзя повысить еще выше!' success: 'Игрок [name] повышен до [rank]' @@ -980,7 +980,7 @@ commands: description: разбанить игрока на острове parameters: <игрок> cannot-unban-yourself: 'Вы не можете разбанить самого себя!' - player-not-banned: 'ИГрок не был забанен ранее.' + player-not-banned: 'Игрок не был забанен ранее.' player-unbanned: '[name]разбанен на вашем острове.' you-are-unbanned: '[name]разбанил вас на своем острове!' banlist: @@ -1003,8 +1003,8 @@ commands: cannot-expel: 'Этот игрок не может быть выгнан.' cannot-expel-member: 'Вы не можете выгнать участника группы!' not-on-island: 'Этот игрок не на вашем острове!' - player-expelled-you: '[name]был выгнан с вашего острова!' - success: 'Вы были выгнаны [name] с его острова.' + player-expelled-you: '[name] выгнал вас с острова!' + success: 'Вы выгнали [name] с острова.' lock: description: заблокировать или разблокировать ваш [prefix_island] locked: 'Ваш [prefix_island] теперь заблокирован.' @@ -1024,9 +1024,9 @@ protection: command-is-banned: Команда запрещена для посетителей flags: ALLAY: - name: Взаимодействие с тихонями и Copper Golem - description: Позволяет забирать/давать предметы тихоне и Copper Golem - hint: Взаимодействие с тихонями и Copper Golem запрещено + name: Взаимодействие с тихонями и медным големом + description: Позволяет забирать/давать предметы тихоне и медному голему + hint: Взаимодействие с тихонями и медным големом запрещено ANIMAL_NATURAL_SPAWN: description: переключатель пассивного спавна животных name: Пассивный спавн животных @@ -1200,7 +1200,7 @@ protection: description: Переключатель возможности взаимодействовать с воронкой hint: Взаимодействие с воронкой запрещено CHEST_DAMAGE: - description: переключательно получения сундуками урона от взрыва + description: переключатель получения сундуками урона от взрыва name: Урон сундукам CHORUS_FRUIT: description: переключатель телепортации @@ -1214,7 +1214,7 @@ protection: name: Очистить супер плоские чанки COARSE_DIRT_TILLING: description: |- - Переключательно очистки каменистой + Переключатель очистки каменистой земли и разрушения подзола для получения земли name: Очищение каменистой земли @@ -1267,7 +1267,7 @@ protection: name: Использование дверей hint: Использование дверей запрещено DRAGON_EGG: - name: Яйко Дракона + name: Яйцо Дракона description: |- Предотвращает взаимодействие с Яйцом Дракона. @@ -1602,10 +1602,10 @@ protection: hint: Взаимодействие с редстоун механизмами запрещено REMOVE_END_EXIT_ISLAND: description: |- - Prevents the end exit - island from generating - at coordinates 0,0 - name: Remove end exit island + Предотвращает генерацию + выходного [prefix_island] в Энде + на координатах 0,0 + name: Удалить выходной остров в Энде REMOVE_MOBS: description: |- Удаляет монстров, когда вы @@ -1699,12 +1699,12 @@ protection: Участники острова все еще будут терять вещи, если будут умирать на своем острове! SPAWN_PROTECTION: - name: Spawn island void protection + name: Защита от пустоты на острове спавна description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Если включено, игроки, упавшие + в пустоту на острове спавна, + будут телепортированы обратно на + точку спавна вместо смерти. RAID_TRIGGER: name: Запуск рейда description: Устанавливает минимальный ранг острова для запуска рейда @@ -1812,7 +1812,7 @@ protection: разъединить team-untrust: |- Выберите ранг, который может - антрестить + убрать доверие team-promote: |- Выберите ранг, который может повысить ранг игрока @@ -1914,7 +1914,7 @@ management: Запущена [name] [version]. BentoBox в настоящее время запущен на - НЕПОДДЕРЖИМЕМОЙ версии серверного ПО + НЕПОДДЕРЖИВАЕМОЙ версии серверного ПО Хотя большинство функций все равно будут работать корректно, специфичные для версии баги или иные проблемы @@ -1923,8 +1923,7 @@ management: Запущена [name] [version]. BentoBox в настоящее время запущен на - НЕСОВМЕСТИМОЙ версии серверного ПО - version. + НЕСОВМЕСТИМОЙ версии серверного ПО. Может возникать странное поведение и ошибки, а большинство функций могут быть нестабильными. @@ -1989,14 +1988,14 @@ enums: THORNS: Шипы DRAGON_BREATH: Драконье дыхание CUSTOM: Пользовательское - FLY_INTO_WALL: Влететь в стену + FLY_INTO_WALL: Столкновение со стеной HOT_FLOOR: Горячий пол - CRAMMING: Зубрёжка - DRYOUT: Сушка - FREEZE: Заморозить - KILL: Убить - SONIC_BOOM: Соник Бум - WORLD_BORDER: Мировая граница + CRAMMING: Давка + DRYOUT: Высыхание + FREEZE: Замерзание + KILL: Убийство + SONIC_BOOM: Звуковой удар + WORLD_BORDER: Граница мира panel: credits: title: '[name] Титры' @@ -2036,9 +2035,9 @@ panels: |[selected] authors: 'Авторы:' author: '- [name]' - selected: '&а В данный момент выбрано.' + selected: 'В данный момент выбрано.' placeholder: - title: 'Placeholder Browser' + title: 'Браузер заполнителей' buttons: bentobox: name: 'BentoBox' From 9f3e58a6bc02402831b234651df6655d4539819d Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:21:09 -0700 Subject: [PATCH 43/95] Fix Romanian (ro.yml) locale: translated placeholders, broken tags, wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate maxsize section and SPAWN_PROTECTION flag from English to Romanian - Fix broken legacy color codes: &b, &a, &un, &r replaced with MiniMessage tags - Restore translated placeholders to English: [număr]->[number], [nume]->[name], [proprietar]->[owner], [data]->[date], [gama]->[range], [interval]->[range], [lume]->[world], [secunde]->[seconds], [modul de joc]->[gamemode], [clasament]->[rank], [linie]->[line], [mesaj]->[message], [descriere]->[description], [autori]->[authors], [selectat]->[selected], [Numele]->[name] - Fix wrong translations: "Olanda" (Netherlands) -> "Nether", "Toamna" (Autumn) -> "Cădere" (Fall), "Bucherie" -> "Înghesuire" (Cramming), "Ferestre" (Windows) -> "Pupitre" (Lecterns), "lutru" (otter) -> "pupitru" (lectern), "dezabona" (unsubscribe) -> "ridică interdicția" (unban), "reproducere" (reproduction) -> "spawn" where appropriate - Fix unban messages that said "banned" instead of "unbanned" - Fix missing [ bracket in name-layout, description-layout, menu-layout, setting-layout - Fix stray "și 7" in last-seen layout and "și 2" in reload messages - Fix deaths.set.success broken color tags and text - Fix click-to-switch with broken [următor] placeholder -> [next] - Fix range.remove.success broken "&b" tag - Fix ENTER_EXIT_MESSAGES island placeholder Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/ro.yml | 166 +++++++++++++++--------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/src/main/resources/locales/ro.yml b/src/main/resources/locales/ro.yml index f3c5f3ffa..303db0932 100644 --- a/src/main/resources/locales/ro.yml +++ b/src/main/resources/locales/ro.yml @@ -66,13 +66,13 @@ commands: modificați numărul de case permise pe această insulă sau pe insula jucătorului parameters: [numele insulei] - max-homes-set: '[nume] - Setați casele maxime ale insulei la [număr]' + max-homes-set: '[name] - Setați casele maxime ale insulei la [number]' errors: - unknown-island: Insulă necunoscută! [nume] + unknown-island: Insulă necunoscută! [name] resethome: description: Resetați casa jucătorului la valoarea implicită parameters: [numele insulei] - cleared: 'Resetare acasă. [nume]' + cleared: 'Resetare acasă. [name]' resets: description: editează resetările jucătorilor set: @@ -120,7 +120,7 @@ commands: timp, în funcție de câți ai... scanning-in-progress: 'Scanare în curs, așteptați' none-found: 'Nu s-au găsit insule de epurat.' - total-islands: 'Aveți [număr] insule în baza de date în toate lumi.' + total-islands: 'Aveți [number] insule în baza de date în toate lumi.' number-error: 'Argumentul trebuie să fie un număr de zile' confirm: 'Tastați /[label] purge confirm pentru a începe purjarea' completed: 'Purjarea sa oprit.' @@ -189,13 +189,13 @@ commands: confirmation: 'Sigur doriți să setați [name] să fie proprietarul insulei la [xyz]?' success: '[name] este acum proprietarul acestei insule.' extra-islands: >- - Avertisment: acest jucător deține acum [număr] insule. Acest lucru + Avertisment: acest jucător deține acum [number] insule. Acest lucru este mai mult decât permis de setări sau perms: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Setați dimensiunea maximă a echipei pentru [prefix_island] unui jucător (folosiți 0 pentru a reseta la valoarea implicită) + success: 'Dimensiunea maximă a echipei pentru [prefix_island] lui [name] a fost setată la [number].' + reset: 'Dimensiunea maximă a echipei pentru [prefix_island] lui [name] a fost resetată la valoarea implicită ([number]).' range: description: comanda de administrare a insulei invalid-value: @@ -236,7 +236,7 @@ commands: description: scade aria protejată a insulei parameters: [locația insulei] success: >- - Scăderea cu succes a zonei protejate de [name] la & b [total] + Scăderea cu succes a zonei protejate de [name] la [total] (- [number] ) . register: parameters: @@ -250,7 +250,7 @@ commands: O insulă nu poate fi plasată aici, îmi pare rău. Consultați consola pentru eventuale erori. island-is-spawn: >- - Insula este reprodusă. Esti sigur? Introduceți din nou comanda pentru + Insula este spawn. Ești sigur? Introduceți din nou comanda pentru a confirma. unregister: parameters: [x,y,z] @@ -268,12 +268,12 @@ commands: no-island: 'Nu vă aflați într-o insulă acum ...' title: '========== Informații despre insulă ============' island-uuid: 'UUID: [uuid]' - owner: 'Proprietar: [proprietar] ([uuid])' - last-login: 'Ultima autentificare: [data]' + owner: 'Proprietar: [owner] ([uuid])' + last-login: 'Ultima autentificare: [date]' last-login-date-time-format: EEE MMM dd HH:mm:ss zzz aaaa deaths: 'Decese: [number]' resets-left: 'Resetări: [number] (Max: [total])' - max-homes: 'Max case: [număr]' + max-homes: 'Max case: [number]' team-members-title: 'Membrii echipei:' team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -284,17 +284,17 @@ commands: island-center: 'Centrul insulei: [xyz]' island-coords: 'Coordonatele insulei: [xz1] la [xz2]' islands-in-trash: 'Player are insule în coșul de gunoi.' - protection-range: 'Domeniu de protecție: [interval]' + protection-range: 'Domeniu de protecție: [range]' protection-range-bonus-title: 'Include aceste bonusuri:' - protection-range-bonus: 'Bonus: [număr]' + protection-range-bonus: 'Bonus: [number]' purge-protected: Insula este protejată de purjare - max-protection-range: 'Cea mai mare gamă de protecție istorică: [gama]' + max-protection-range: 'Cea mai mare gamă de protecție istorică: [range]' protection-coords: 'Coordonate de protecție: de la [xz1] la [xz2]' - is-spawn: Insula este o insulă de reproducere + is-spawn: Insula este o insulă spawn banned-players: 'Jucători excluși:' banned-format: '[name]' unowned: 'Fără proprietate' - bundle: 'Blueprint Bundle folosit pentru a crea insula: [nume]' + bundle: 'Blueprint Bundle folosit pentru a crea insula: [name]' switch: description: activați / dezactivați ocolirea protecției op: >- @@ -380,15 +380,15 @@ commands: confirmation: 'Sigur doriți să setați această insulă ca spawn pentru această lume?' success: 'Setați cu succes această insulă ca spawn pentru această lume.' setspawnpoint: - description: setați locația curentă ca punct de reproducere pentru această insulă + description: setați locația curentă ca punct de spawn pentru această insulă no-island-here: 'Nu există insulă aici.' confirmation: >- - Sigur doriți să setați această locație ca punct de reproducere pentru + Sigur doriți să setați această locație ca punct de spawn pentru această insulă? success: >- - Setați cu succes această locație ca punct de reproducere pentru + Setați cu succes această locație ca punct de spawn pentru această insulă. - island-spawnpoint-changed: '[user] a schimbat acest punct de reproducere al insulei.' + island-spawnpoint-changed: '[user] a schimbat acest punct de spawn al insulei.' settings: parameters: '[jucător]' description: deschideți setările de sistem sau setările de insulă pentru player @@ -401,7 +401,7 @@ commands: file-exists: 'Fișierul există deja, suprascrieți?' no-such-file: 'Nu există un astfel de fișier!' could-not-load: 'Nu s-a putut încărca acel fișier!' - could-not-save: 'Hmm, ceva nu a funcționat bine salvând acel fișier: [mesaj]' + could-not-save: 'Hmm, ceva nu a funcționat bine salvând acel fișier: [message]' set-pos1: 'poziție 1 setată la [vector]' set-pos2: 'poziție 2 setată la [vector]' set-different-pos: 'Setați o altă locație - această poziție este deja setată!' @@ -492,7 +492,7 @@ commands: pick-a-unique-name: Vă rugăm să alegeți un nume mai unic stripped-char-in-unique-name: >- Unele caractere au fost eliminate deoarece nu sunt permise. ID - nou va fi [nume]. + nou va fi [name]. success: Succes! conversation-prefix: '>' description: @@ -512,7 +512,7 @@ commands: Faceți clic stânga pentru a crește Faceți clic dreapta pentru a reduce unlimited-times: Nelimitat - maximum-times: Max [număr] ori + maximum-times: Max [number] ori cost: | Costul [prefix_Island] Clic stânga +1 @@ -575,7 +575,7 @@ commands: set: description: stabilește moartea jucătorului parameters: - success: 'S-a setat cu succes [name] ecesele lui [number] & a.' + success: 'S-a setat cu succes decesele lui [name] la [number].' add: description: adaugă morți jucătorului parameters: @@ -607,8 +607,8 @@ commands: error: 'Nu s-a putut scrie lista de substituenți: [message]' reload: description: reîncarcă BentoBox și toate suplimentele, setările și setările locale - locales-reloaded: '[prefix_bentobox] și 2 limbi reîncărcate.' - addons-reloaded: '[prefix_bentobox] și 2 addonuri reîncărcate.' + locales-reloaded: '[prefix_bentobox] Limbi reîncărcate.' + addons-reloaded: '[prefix_bentobox] Addonuri reîncărcate.' settings-reloaded: '[prefix_bentobox] Setări reîncărcate.' addon: '[prefix_bentobox] Reîncărcare [name] .' addon-reloaded: '[prefix_bentobox] [name] reîncărcat.' @@ -650,21 +650,21 @@ commands: description: enumerați, adăugați sau eliminați ranguri parameters: '[lista | adauga | elimina] [referință de rang] [valoare de rang]' add: - success: '[clasament] adăugat cu valoarea [număr]' + success: '[rank] adăugat cu valoarea [number]' failure: >- - Nu s-a putut adăuga [clasament] cu valoarea [număr]. Poate un + Nu s-a putut adăuga [rank] cu valoarea [number]. Poate un duplicat? remove: - success: '[clasament] eliminat' + success: '[rank] eliminat' failure: 'Nu s-a putut elimina [rank]. Rang necunoscut.' list: 'Clasamentele înregistrate sunt după cum urmează:' confirmation: - confirm: 'Tastați din nou comanda în [secunde] s pentru a confirma.' + confirm: 'Tastați din nou comanda în [seconds] s pentru a confirma.' previous-request-cancelled: 'Cererea de confirmare anterioară a fost anulată.' request-cancelled: 'Timpul limită de confirmare - cererea a fost anulată.' delay: previous-command-cancelled: 'Comanda anterioară a fost anulată' - stand-still: 'Nu vă mișcați! Se teleportează în [secunde] secunde' + stand-still: 'Nu vă mișcați! Se teleportează în [seconds] secunde' moved-so-command-cancelled: 'Te-ai mutat. Teleportul a fost anulat!' island: about: @@ -705,7 +705,7 @@ commands: estimated-time: 'Timp estimat: [number] secunde.' blocks: 'Construiți-l bloc cu bloc: [number] blocuri în toate ...' entities: 'Completarea cu entități: [number] entități în toate ...' - dimension-done: 'Insulă în [lume] este construită.' + dimension-done: 'Insulă în [world] este construită.' done: 'Gata! Insula ta este gata și te așteaptă!' pick: 'Alegeți o insulă' cannot-afford: 'Nu vă puteți permite acest lucru! Cost: [cost]' @@ -749,14 +749,14 @@ commands: sethome: description: setați punctul dvs. de teleportare de acasă must-be-on-your-island: 'Trebuie să fii pe insula ta pentru a pleca acasă!' - too-many-homes: 'Nu se poate seta - insula ta este la maximum [număr] case.' + too-many-homes: 'Nu se poate seta - insula ta este la maximum [number] case.' home-set: 'Casa insulei dvs. a fost setată la locația dvs. curentă.' homes-are: 'Casele din Island sunt:' - home-list-syntax: '[nume]' + home-list-syntax: '[name]' click-to-teleport: 'Faceți clic pentru a vă teleporta!' nether: - not-allowed: 'Nu aveți voie să vă stabiliți casa în Olanda.' - confirmation: 'Sunteți sigur că doriți să vă stabiliți casa în Olanda?' + not-allowed: 'Nu aveți voie să vă stabiliți casa în Nether.' + confirmation: 'Sunteți sigur că doriți să vă stabiliți casa în Nether?' the-end: not-allowed: 'Nu aveți voie să vă setați casa la sfârșit.' confirmation: 'Sigur doriți să vă setați casa la sfârșit?' @@ -819,7 +819,7 @@ commands: offline: 'o [name] ([last_seen])' offline-not-last-seen: 'o [name]' last-seen: - layout: '[number] și 7 [unitate] în urmă' + layout: '[number] [unit] în urmă' days: zile hours: ore minutes: minute @@ -838,7 +838,7 @@ commands: you-are-a-coop-member: 'Ați fost cooptat de [name] .' success: 'Ați copiat [name] .' name-has-invited-you: | - [nume] v-a invitat + [name] v-a invitat să se alăture ca membru coop insulei lor. uncoop: @@ -858,7 +858,7 @@ commands: parameters: trust-in-yourself: 'Ai încredere în tine!' name-has-invited-you: | - [nume] v-a invitat + [name] v-a invitat să se alăture ca membru de încredere insulei lor. player-already-trusted: 'Player este deja de încredere!' @@ -878,7 +878,7 @@ commands: invitation-sent: 'Invitație trimisă la [name] .' removing-invite: 'Eliminarea invitației.' name-has-invited-you: | - [nume] v-a invitat + [name] v-a invitat să se alăture insulei lor. to-accept-or-reject: >- echipă Do / [label] acceptă să accepte, sau / [label] echipa @@ -894,7 +894,7 @@ commands: search: 'Căutați un jucător' searching: | Căutând - [nume] + [name] enter-name: 'Introduceți numele:' tips: LEFT: @@ -947,9 +947,9 @@ commands: kick: description: scoateți un membru din insula dvs. parameters: - player-kicked: '[Numele] te-a dat afară de pe insulă în [modul de joc]!' + player-kicked: '[name] te-a dat afară de pe insulă în [gamemode]!' cannot-kick: 'Nu te poți lovi cu piciorul!' - cannot-kick-rank: 'Rangul tău nu permite să-l lovești pe [nume]!' + cannot-kick-rank: 'Rangul tău nu permite să-l lovești pe [name]!' success: '[name] a fost dat afară din insula dvs.' demote: description: retrogradează un jucător pe insula ta într-un rang @@ -995,17 +995,17 @@ commands: owner-banned-you: '[name] v-a interzis din insula lor!' you-are-banned: 'Ești interzis din această insulă!' unban: - description: dezabonează un jucător de pe insula ta + description: ridică interdicția unui jucător de pe insula ta parameters: - cannot-unban-yourself: 'Nu vă puteți dezabona!' + cannot-unban-yourself: 'Nu vă puteți ridica propria interdicție!' player-not-banned: 'Player nu este interzis.' - player-unbanned: '[name] este acum interzis de pe insula dvs.' - you-are-unbanned: '[name] te-a interzis de pe insula lor!' + player-unbanned: '[name] nu mai este interzis de pe insula dvs.' + you-are-unbanned: '[name] v-a ridicat interdicția de pe insula lor!' banlist: description: lista jucătorilor interzisi noone: 'Nimeni nu este interzis pe această insulă.' the-following: 'Următorii jucători sunt interziși:' - names: '[linie]' + names: '[line]' you-can-ban: 'Puteți interzice până la [number] mai mulți jucători.' settings: description: afișează setările insulei @@ -1184,7 +1184,7 @@ protection: hint: Accesul la cutia Shulker este dezactivat SHULKER_TELEPORT: description: |- - &un Shulker se poate teleporta + Un Shulker se poate teleporta dacă este activ. name: Teleportarea lui Shulker SMITHING: @@ -1330,7 +1330,7 @@ protection: hint: Utilizarea Enderpearl este dezactivată ENTER_EXIT_MESSAGES: description: Afișați mesajele de intrare și ieșire - island: insula [numele] + island: '[prefix_island] lui [name]' name: Introduceți / ieșiți din mesaje now-entering: 'Acum introduceți [name] .' now-entering-your-island: 'Acum intrând în insula ta: [name]' @@ -1455,14 +1455,14 @@ protection: name: Utilizarea lesei hint: Utilizarea lesei este dezactivată LECTERN: - name: Ferestre + name: Pupitre description: |- - Permiteți plasarea cărților pe un lutru + Permiteți plasarea cărților pe un pupitru sau să iei cărți din ea. Nu împiedică jucătorii citirea cărților. - hint: nu poate așeza o carte pe un lutru sau lua o carte de pe ea. + hint: nu poate așeza o carte pe un pupitru sau lua o carte de pe ea. LEVER: description: Comutați utilizarea name: Utilizarea manetei @@ -1495,7 +1495,7 @@ protection: name: Schimbați setările description: |- Permiteți să comutați ce membru - &un rol poate modifica setările insulei. + un rol poate modifica setările insulei. MILKING: description: Comutați mulsul de vacă name: Mulsul @@ -1633,11 +1633,11 @@ protection: PVP_NETHER: description: |- Activați / dezactivați PVP - în Olanda. + în Nether. name: PVP Nether - hint: PVP dezactivat în Olanda + hint: PVP dezactivat în Nether enabled: 'PVP-ul din Nether a fost activat.' - disabled: 'PVP din Olanda a fost dezactivat.' + disabled: 'PVP din Nether a fost dezactivat.' PVP_OVERWORLD: description: |- Activați / dezactivați PVP @@ -1724,7 +1724,7 @@ protection: name: Copaci care cresc în afara razei de acțiune description: |- Comutați dacă arborii pot crește în afara unei - &zona de protecție a unei insule sau nu. + zona de protecție a unei insule sau nu. Nu numai că va preveni așezarea puieților în afara zonei de protecție a unei insule de la creștere, dar va bloca și generația @@ -1759,12 +1759,12 @@ protection: Membrii Island încă își pierd obiectele dacă mor pe propria lor insulă! SPAWN_PROTECTION: - name: Spawn island void protection + name: Protecția insulei spawn împotriva vidului description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Când este activat, jucătorii care cad + în vid pe insula spawn + vor fi teleportați înapoi la + punctul de spawn în loc să moară. RAID_TRIGGER: name: Declanșare raid description: Setează rangul minim al insulei necesar pentru a declanșa un raid @@ -1817,7 +1817,7 @@ protection: expert: name: 'Setări expert' description: 'Afișează toate setările disponibile.' - click-to-switch: 'Faceți clic pe pentru a comuta la [următor] & r .' + click-to-switch: 'Faceți clic pe pentru a comuta la [next].' reset-to-default: name: 'Resetați la valorile implicite' description: | @@ -1844,7 +1844,7 @@ protection: Setări de protecție când jucător se află în afara insulei lor flag-item: - name-layout: 'nume]' + name-layout: '[name]' command-instructions: setname: | Selectați rangul care poate @@ -1898,7 +1898,7 @@ protection: Selectați rangul care poate utilizați comanda border description-layout: | - descriere] + [description] Faceți clic stânga pentru a merge în jos. Faceți clic dreapta pe pentru a merge în sus. @@ -1908,12 +1908,12 @@ protection: blocked-rank: '- [rank]' minimal-rank: '- [rank]' menu-layout: | - descriere] + [description] Faceți clic pe pentru a deschide. setting-cooldown: 'Setarea este activată' setting-layout: | - descriere] + [description] Faceți clic pe pentru a comuta. @@ -2039,7 +2039,7 @@ enums: ENTITY_SWEEP_ATTACK: Atac cu Sweep PROJECTILE: Proiectil SUFFOCATION: Sufocare - FALL: Toamna + FALL: Cădere FIRE: Foc FIRE_TICK: Ardere MELTING: Topire @@ -2060,7 +2060,7 @@ enums: CUSTOM: Personalizat FLY_INTO_WALL: Zboară în perete HOT_FLOOR: Podea fierbinte - CRAMMING: Bucherie + CRAMMING: Înghesuire DRYOUT: Uscarea FREEZE: Îngheţa KILL: Ucide @@ -2084,14 +2084,14 @@ panels: island_homes: title: 'Casele tale de pe insula' buttons: - name: '[nume]' + name: '[name]' island_creation: title: 'Alegeți o insulă' buttons: bundle: - name: '[nume]' - description: '[descriere]' - uses: 'Folosit [număr]/[max]' + name: '[name]' + description: '[description]' + uses: 'Folosit [number]/[max]' unlimited: 'Utilizări nelimitate permise' cost: 'Cost: [cost]' language: @@ -2099,12 +2099,12 @@ panels: edited: 'Schimbat în [lang]' buttons: language: - name: '[nume]' + name: '[name]' description: |- - [autori] - |[selectat] + [authors] + |[selected] authors: 'autori: ' - author: '- [nume]' + author: '- [name]' selected: 'Selectat în prezent.' placeholder: title: 'Placeholder Browser' @@ -2147,10 +2147,10 @@ panels: buttons: previous: name: 'Pagina anterioară' - description: 'Comutați la pagina [număr].' + description: 'Comutați la pagina [number].' next: name: 'Pagina următoare' - description: 'Comutați la pagina [număr].' + description: 'Comutați la pagina [number].' tips: click-to-next: 'Faceți clic pe pentru următorul.' click-to-previous: 'Faceți clic pe pentru anterior.' From 131c141295ff22c53263c9f486831d065d94a6b0 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:21:23 -0700 Subject: [PATCH 44/95] Fix Turkish (tr.yml) locale: translate untranslated strings, fix broken tags and wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English: maxsize section, SPAWN_PROTECTION, VISITOR_KEEP_INVENTORY, WORLD_BLOCK_EXPLODE_DAMAGE, accept confirmation, cannot-switch, hint strings (jukebox, note block, portals, turtle eggs, frost walker), Placeholder Browser title, Commits label, catalog descriptions - Fix broken color codes: '& 7'/'& c' -> MiniMessage tags, '&Yapıştırılıyor' -> proper tag - Fix wrong translations: Görünmez (invisible) -> Yenilmez (invincible), Kulaklık (headphones) -> Tasma (leash), Kayış -> Tasma, Nakarat meyvesi -> Koro Meyvesi, Aşırı Dünya -> Üst Dünya (overworld), Sıkışmış göğüs -> Tuzaklı sandık (trapped chest), Kığırlaştırıcı -> Buz Yürüyücü, Duvara Yapışma -> Duvara Uçma, tanıtamazsın -> terfi ettiremezsin, Son Sayfa -> Sonraki Sayfa, [tamed animals] -> Evcil hayvanlara - Fix typos: 9artık -> artık, iteşimie -> iletişime, teleporto -> teleport, Kullanım kullanımı -> Zanaatkar kullanımını aç/kapat - Translate 'obtain dirt' leftover English in COARSE_DIRT_TILLING - Translate 'Allowed for:' in flag panel Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/tr.yml | 106 +++++++++++++++--------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/main/resources/locales/tr.yml b/src/main/resources/locales/tr.yml index 375a189bb..2f9bfe3b4 100644 --- a/src/main/resources/locales/tr.yml +++ b/src/main/resources/locales/tr.yml @@ -18,7 +18,7 @@ general: errors: command-cancelled: 'Komut iptal edildi!' no-permission: 'Bu izne sahip degilsin! Ada açamıyorsan /ada' - insufficient-rank: 'Rankınız bunu yapacak kadar yüksek değil! (& 7 [rank] & c)' + insufficient-rank: 'Rankınız bunu yapacak kadar yüksek değil! ([rank])' use-in-game: 'Bu komutu sadece oyundayken kullanabilirsin!' use-in-console: 'Bu komut yalnızca konsolda kullanılabilir.' no-team: 'Bir takımda değilsin!' @@ -32,7 +32,7 @@ general: not-in-team: 'Oyuncu senin takımında degil!' offline-player: 'Oyuncu çevrimdışı ya da yok.' unknown-player: '[name] adlı bir oyuncu yok!' - general: 'u komut henüz hazır değil. - Admin ile iteşimie geç!' + general: 'Bu komut henüz hazır değil. - Admin ile iletişime geç!' unknown-command: 'Bilinmeyen komut. /[label] help' wrong-world: 'Bu komudu kullanmak için adanda olmalısın!' you-must-wait: 'Komut yazabilmek için [number] saniye beklemelisin!' @@ -40,7 +40,7 @@ general: not-on-island: '[prefix_island] üzerinde değilsin!' slow-down: 'Yavaş ol. Daha yavaş tıkla.' worlds: - overworld: Aşırı Dünya + overworld: Üst Dünya nether: Nether the-end: Son commands: @@ -60,7 +60,7 @@ commands: description: >- bu [prefix_island] veya oyuncunun [prefix_island] için izin verilen ev sayısını değiştir - parameters: [[prefix_adası] isim] + parameters: [[prefix_island] isim] max-homes-set: '[name] - [prefix_island] maksimum ev sayısını [number] olarak ayarla' errors: unknown-island: Bilinmeyen [prefix_island]! [name] @@ -187,9 +187,9 @@ commands: izinler tarafından izin verilen [max] miktarından fazladır. maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: Bir oyuncunun [prefix_island] maksimum takım boyutunu ayarla (dünya varsayılanına sıfırlamak için 0 kullan) + success: '[name] oyuncusunun [prefix_island] maksimum takım boyutu [number] olarak ayarlandı.' + reset: '[name] oyuncusunun [prefix_island] maksimum takım boyutu dünya varsayılanına ([number]) sıfırlandı.' range: description: Admin ada menzili ayarlama invalid-value: @@ -299,7 +299,7 @@ commands: out-of-range: >- Sayı 1 ila [number] arasında olmalıdır. [player] Çöp olan ada numaralarını görmek için [label] - cannot-switch: 'Switch failed. See console log for error.' + cannot-switch: 'Değiştirme başarısız oldu. Hata için konsol kaydına bakın.' success: 'Başarıyla oyuncunun adasını belirtilen ada değiştirdi..' trash: no-unowned-in-trash: 'Çöpte sahipsiz ada yok.' @@ -432,7 +432,7 @@ commands: description: Taslağın orta noktası olduğun pozisyon olarak belirler. paste: description: Panodaki taslağı olduğun bölgeye yapıştırır. - pasting: '&Yapıştırılıyor...' + pasting: 'Yapıştırılıyor...' pos1: description: Kare bir alan için 1. pozisyonu ayarlar. pos2: @@ -814,7 +814,7 @@ commands: all-members-logged-off: >- Tum ada oyuncuları cevrımdısı. Isci yetkin [name]adasından alındı! - success: '[name] 9artık adanda işçi değil!' + success: '[name] artık adanda işçi değil!' is-full: 'Başkasını kooperatif üyesi yapamazsınız.' trust: description: Adana arkadas ekle @@ -884,8 +884,8 @@ commands: bakabilirsin! name-joined-your-island: '[name] adana katıldı!' confirmation: |- - Are you sure you want to accept this invite? - You will LOSE your current island! + Bu daveti kabul etmek istediğine emin misin? + Mevcut adanı KAYBEDECEKSİN! reject: description: Daveti reddet you-rejected-invite: 'Ada katılma istegini reddettin!' @@ -917,7 +917,7 @@ commands: description: Adandaki üyelerin yetkisini yükselt. parameters: errors: - cant-promote-yourself: 'Kendini tanıtamazsın!' + cant-promote-yourself: 'Kendini terfi ettiremezsin!' cant-promote: 'Rütbenizin üstüne terfi edemezsiniz!' must-be-member: 'Oyuncu [prefix_an-island] üyesi olmalıdır!' failure: 'Oyuncunun rankı daha fazla artıralamıyor!' @@ -1095,7 +1095,7 @@ protection: hint: Varil erişimi devre dışı bırakıldı CRAFTER: name: Zanaatkar - description: Kullanım kullanımı + description: Zanaatkar kullanımını aç/kapat hint: Zanaatkar devre dışı BLOCK_EXPLODE_DAMAGE: description: |- @@ -1138,7 +1138,7 @@ protection: hint: Taş kesim erişimi devre dışı bırakıldı TRAPPED_CHEST: name: Kapana kısılmış sandıklar - description: Sıkışmış göğüs etkileşimini aç/kapat + description: Tuzaklı sandık etkileşimini aç/kapat hint: Kapana kısılmış sandık erişimi devre dışı DISPENSER: name: Fırlatıcı @@ -1161,7 +1161,7 @@ protection: name: Sandık hasarı CHORUS_FRUIT: description: Işınlanma kullanımı değiş. - name: Nakarat meyvesi + name: Koro Meyvesi hint: Işınlanma kapalı CLEAN_SUPER_FLAT: description: |- @@ -1173,7 +1173,7 @@ protection: description: |- Çapa ile iri taneli toprak topraği sürmeyi kapar/açar. - obtain dirt + toprak elde etme name: İri taneli toprak sürme hint: İri taneli toprağı sürme kapalı. COLLECT_LAVA: @@ -1325,7 +1325,7 @@ protection: description: >- Zarar verme aç/kapa. Etkin olduğunda, evcil hayvanlar hasar alabilir. Devre dışı olduğunda, onları yok edilemez hale getirir. - name: Zarar verme [tamed animals] + name: Evcil hayvanlara zarar verme hint: Ehlileştirilmiş hayvan zarar verme devre dışı HURT_ANIMALS: description: Hasar alımını değiş @@ -1350,7 +1350,7 @@ protection: name: Item Frame Hasarı INVINCIBLE_VISITORS: description: 'Ziyaretçi ayarlarını ayarlar.' - name: 'Görünmez misafirler' + name: 'Yenilmez misafirler' hint: 'Misafirler korunuyor.' ISLAND_RESPAWN: description: |- @@ -1368,14 +1368,14 @@ protection: JUKEBOX: description: Kullanımını değiş. name: Müzik kutusu kullanımı. - hint: No jukebox use allowed + hint: Müzik kutusu kullanımına izin verilmez LEAF_DECAY: name: Yaprak düşümü description: Yaprak düşümünü değiş. LEASH: description: Kullanımını değiş. - name: Kayış kullanımı - hint: Kulaklık kullanımı devre dışı bırakıldı + name: Tasma kullanımı + hint: Tasma kullanımı devre dışı bırakıldı LECTERN: name: Kürsü description: |- @@ -1452,7 +1452,7 @@ protection: NOTE_BLOCK: description: Kullanımını değiş. name: Nota bloğu - hint: No note block use + hint: Nota bloğu kullanımına izin verilmez OBSIDIAN_SCOOPING: name: Obsidiyeni lava dönüştürme description: |- @@ -1505,11 +1505,11 @@ protection: NETHER_PORTAL: description: Kullanımı değiş. name: Cehennem Portalı - hint: Portal use is disallowed + hint: Portal kullanımına izin verilmez END_PORTAL: description: Kullanımı değiş. name: Son Portal - hint: Portal use is disallowed + hint: Portal kullanımına izin verilmez PAUSE_MOB_GROWTH: name: Mob büyümesini duraklat description: |- @@ -1614,11 +1614,11 @@ protection: TURTLE_EGGS: description: Kırılmayı değiş. name: Kaplumbağa yumurtası - hint: Turtle eggs cannot be crushed! + hint: Kaplumbağa yumurtaları ezilemez! FROST_WALKER: - description: Kığırlaştırıcı büyüsünü kapat/aç. - name: Kığırlaştırıcı - hint: Frost Walker cannot be used here + description: Buz Yürüyücü büyüsünü kapat/aç. + name: Buz Yürüyücü + hint: Buz Yürüyücü burada kullanılamaz EXPERIENCE_PICKUP: name: XP yerden al description: XP alışını değiş. @@ -1630,21 +1630,21 @@ protection: adaya geri dönme komudunu engeller. hint: 'Adandan aşağaya düşerken adana geri ışınlanamazsın!' VISITOR_KEEP_INVENTORY: - name: Ziyaretçiler ölümle ilgili envanter tutuyor + name: Ziyaretçiler ölümde envanterini korur description: |- - Prevent players from losing their - items and experience if they die on - an island in which they are a visitor. + Ziyaretçi olarak bulundukları bir adada + ölen oyuncuların eşyalarını ve + deneyim puanlarını kaybetmesini önler. - Island members still lose their items - if they die on their own island! + Ada üyeleri kendi adalarında ölürse + eşyalarını kaybetmeye devam eder! SPAWN_PROTECTION: - name: Spawn island void protection + name: Doğma adası boşluk koruması description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Etkinleştirildiğinde, doğma adasında + boşluğa düşen oyuncular ölmek + yerine doğma noktasına geri + ışınlanır. RAID_TRIGGER: name: Baskın tetikleyici description: Baskın tetiklemek için gereken minimum ada rütbesini belirler @@ -1653,7 +1653,7 @@ protection: name: Varlık portal kullanımı description: |- Varlıkların (oyuncu olmayan) boyutlar arasında - teleporto olmak için portalları + teleport olmak için portalları kullanıp kullanamayacağını açık/kapalı yapar WIND_CHARGE: name: Rüzgar şarjı @@ -1669,9 +1669,9 @@ protection: ve adalara hasar verebilir. WORLD_BLOCK_EXPLODE_DAMAGE: description: |- - Allow Bed & Respawn Anchors - to break blocks and damage - entities outside of island limits. + Yatak ve Yeniden Doğma Çapalarının + ada sınırları dışındaki blokları + kırmasına ve varlıklara zarar vermesine izin ver. name: Dünya bloğu patlama hasarı WORLD_TNT_DAMAGE: description: |- @@ -1754,7 +1754,7 @@ protection: description-layout: | [description] - Allowed for: + İzin verilenler: allowed-rank: '- [rank]' blocked-rank: '- ' minimal-rank: '- [rank]' @@ -1775,7 +1775,7 @@ management: description: 'Tıkla ve yüklü oyun modlarını gör.' blueprints: name: 'Taslaklar' - description: 'Opens the Admin Blueprint menu.' + description: 'Yönetici Taslak menüsünü açar.' gamemode: name: '[name]' description: | @@ -1845,8 +1845,8 @@ catalog: gamemodes: name: 'Oyun Modları' description: | - Click to browse through the - available official Gamemodes. + Tıkla mevcut resmi Oyun Modlarına + göz atmak için. addons: name: 'Eklentiler' description: | @@ -1894,12 +1894,12 @@ enums: THORNS: Dikenler DRAGON_BREATH: Ejderha Nefesi CUSTOM: Özel - FLY_INTO_WALL: Duvara Yapışma + FLY_INTO_WALL: Duvara Uçma HOT_FLOOR: Sıcak Zemin CRAMMING: Sıkışma DRYOUT: Kuruma FREEZE: Donma - KILL: Öldür + KILL: Öldürme SONIC_BOOM: Sonik patlama WORLD_BORDER: Dünya Sınırı panel: @@ -1907,7 +1907,7 @@ panel: title: '[name] Emeği geçenler' contributor: name: '[name]' - description: 'Commits: [commits]' + description: 'Katkılar: [commits]' empty-here: name: 'Burası boş gibi gözüküyor...' description: |- @@ -1941,7 +1941,7 @@ panels: author: '- [name]' selected: 'Şu anda seçili.' placeholder: - title: 'Placeholder Browser' + title: 'Yer Tutucu Tarayıcısı' buttons: bentobox: name: 'BentoBox' @@ -1983,7 +1983,7 @@ panels: name: 'Önceki Sayfa' description: '[number] sayfaya geçiş yap' next: - name: 'Son Sayfa' + name: 'Sonraki Sayfa' description: '[number] sayfaya geç' tips: click-to-next: 'Tıkla sonraki için.' From 03bc988220319efaad611751f1d083a1052befa1 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:21:46 -0700 Subject: [PATCH 45/95] Fix Vietnamese (vi.yml) locale: translate English strings, fix typos and wrong translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated English: maxsize section, switch/switchto, setrange, tp, getrank, setrank, setspawn, setspawnpoint, settings, blueprint rename, delete, why debug, SPAWN_PROTECTION flag, max-homes, trash count, out-of-range, use-switch, too-long - Remove AI response from perm-not-required ("Sure! Please provide...") - Fix typos: thẩy->thấy, lời mồi->lời mời, Đống góp->Đóng góp, tương tắt->tương tác, đệ->để, Sát thường->Sát thương, đống góp->đóng góp - Fix wrong translations: bồn rửa->chìm (sink as sinking), Hiện ra dệt->Khung dệt (Loom), Mài đá->Bệ mài (Grindstone), ám lực->áp lực (pressure), tủ ong->tổ ong (beehive), Thế Giới Địa Ngục->Thế Giới Kết Thúc (The End sethome context) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/vi.yml | 133 +++++++++++++++--------------- 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/src/main/resources/locales/vi.yml b/src/main/resources/locales/vi.yml index 0cd793707..a43b67386 100644 --- a/src/main/resources/locales/vi.yml +++ b/src/main/resources/locales/vi.yml @@ -25,7 +25,7 @@ general: player-has-island: 'Người chơi đã có đảo!' player-has-no-island: 'Người chơi không có đảo!' already-have-island: 'Bạn đã có đảo!' - no-safe-location-found: 'Không tìm thẩy điểm an toàn để dịch chuyển.' + no-safe-location-found: 'Không tìm thấy điểm an toàn để dịch chuyển.' not-owner: 'Bạn không phải chủ đảo!' player-is-not-owner: '[name] không phải chủ đảo!' not-in-team: 'Người chơi đó không có ở đội của bạn!' @@ -189,10 +189,10 @@ commands: Cảnh báo: người chơi này hiện đang sở hữu [number] hòn đảo. Đây là nhiều hơn mức cho phép theo cài đặt hoặc quyền: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: đặt kích thước đội tối đa cho [prefix_island] của người chơi (dùng 0 để đặt lại về mặc định) + success: 'Đã đặt kích thước đội tối đa của [prefix_island] [name] thành [number].' + reset: 'Đã đặt lại kích thước đội tối đa của [prefix_island] [name] về mặc định ([number]).' range: description: lệnh độ dài cho quản trị viên invalid-value: @@ -263,7 +263,7 @@ commands: last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: 'Chết: [number]' resets-left: 'Lần làm lại: [number] (Tối đa: [total])' - max-homes: 'Max homes: [number]' + max-homes: 'Số nhà tối đa: [number]' team-members-title: 'Thành viên đảo:' team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -288,26 +288,26 @@ commands: switch: description: bật/tắt bỏ qua bảo vệ op: 'Các Ops luôn có thể vượt qua sự bảo vệ. Deop để sử dụng lệnh.' - removing: Removing protection bypass... - adding: Adding protection bypass... + removing: 'Đang tắt bỏ qua bảo vệ...' + adding: 'Đang bật bỏ qua bảo vệ...' switchto: - parameters: - description: switch player's island to the numbered one in trash + parameters: + description: chuyển đảo của người chơi sang đảo được đánh số trong thùng rác out-of-range: >- - Number must be between 1 and [number]. Use [label] trash [player] - to see island numbers + Số phải nằm trong khoảng 1 đến [number]. Dùng [label] trash [player] + để xem số đảo cannot-switch: 'Chuyển đổi không thành công. Xem nhật ký điều khiển để biết lỗi.' - success: 'Successfully switched the player''s island to the specified one.' + success: 'Đã chuyển đảo của người chơi sang đảo được chỉ định.' trash: no-unowned-in-trash: 'Không có hòn đảo không có chủ trong thùng rác' no-islands-in-trash: 'Người chơi không có đảo nào trong thùng rác.' parameters: '[Người chơi]' description: hiển thị các đảo không sở hữu hoặc đảo của người chơi trong thùng rác title: '=========== Các Đảo Trong Rác ===========' - count: 'Island [number]:' + count: 'Đảo [number]:' use-switch: >- - Use [label] switchto to switch player to - island in trash + Dùng [label] switchto để chuyển người chơi sang + đảo trong thùng rác use-emptytrash: >- Sử dụng [label] emptytrash [player]để xóa vĩnh viễn các vật phẩm rác @@ -320,9 +320,9 @@ commands: version: description: hiển thị phiên bản BentoBox và các addon setrange: - parameters: - description: set the range of player's island - range-updated: 'Island range updated to [number].' + parameters: <Độ dài> + description: đặt phạm vi đảo của người chơi + range-updated: 'Đã cập nhật phạm vi đảo thành [number].' placeholders: description: mở trình duyệt trình giữ chỗ dump-placeholders: @@ -332,8 +332,8 @@ commands: reload: description: 'Tải lại' tp: - parameters: [player to teleport] - description: teleport to a player's island + parameters: [người chơi để dịch chuyển] + description: dịch chuyển đến đảo của người chơi manual: >- Không tìm thấy warp an toàn! Tự tay tp gần [location] và kiểm tra nó. @@ -343,15 +343,15 @@ commands: người chơi] description: dịch chuyển một người chơi đến [prefix_island] của người chơi khác getrank: - parameters: [island owner] - description: get a player's rank on their island or the island of the owner - rank-is: 'Rank is [rank] on [name]''s island.' + parameters: [chủ đảo] + description: xem hạng của người chơi trên đảo của họ hoặc đảo của chủ + rank-is: 'Hạng là [rank] trên đảo của [name].' setrank: - parameters: [island owner] - description: set a player's rank on their island or the island of the owner + parameters: [chủ đảo] + description: đặt hạng của người chơi trên đảo c��a họ hoặc đảo của chủ unknown-rank: 'Hạng không xác định!' not-possible: 'Hạng phải cao hơn khách tham quan.' - rank-set: 'Rank set from [from] to [to] on [name]''s island.' + rank-set: 'Đã đặt hạng t�� [from] thành [to] trên đảo của [name].' setprotectionlocation: parameters: '[toạ độ x y z]' description: đặt vị trí hiện tại hoặc [x y z] là điểm giữa khu vực bảo vệ @@ -362,22 +362,22 @@ commands: island-location-changed: '[user] đổi điểm giữa bảo vệ thành [xyz].' xyz-error: 'Xác định 3 toạ độ: ví dụ 100 120 100' setspawn: - description: set an island as spawn for this gamemode - already-spawn: 'This island is already a spawn!' - no-island-here: 'There is no island here.' - confirmation: 'Are you sure you want to set this island as the spawn for this world?' - success: 'Successfully set this island as the spawn for this world.' + description: đặt một đảo làm điểm hồi sinh cho chế độ này + already-spawn: 'Đảo này đã là điểm hồi sinh!' + no-island-here: 'Không có đảo ở đây.' + confirmation: 'Bạn có chắc muốn đặt đảo này làm điểm hồi sinh cho thế giới này không?' + success: 'Đã đặt thành công đảo này làm điểm hồi sinh cho thế giới này.' setspawnpoint: - description: set current location as spawn point for this island - no-island-here: 'There is no island here.' + description: đặt vị trí hiện tại làm điểm hồi sinh cho đ��o này + no-island-here: 'Không có đảo ở đây.' confirmation: >- Bạn có chắc chắn muốn đặt vị trí này làm điểm spawn cho hòn đảo này không? - success: 'Successfully set this location as the spawn point for this island.' - island-spawnpoint-changed: '[user] changed this island spawn point.' + success: 'Đã đặt thành công vị trí này làm điểm hồi sinh cho đảo này.' + island-spawnpoint-changed: '[user] đã thay đổi điểm hồi sinh của đảo này.' settings: parameters: '[player]' - description: open system settings or island settings for player + description: mở cài đặt hệ thống hoặc cài đặt đảo cho người chơi unknown-setting: 'Tuỳ chỉnh không tồn tại' blueprint: parameters: @@ -403,7 +403,7 @@ commands: sink: description: đặt bản thiết kế này để chìm xuống đáy đại dương khi được dán vào status: 'Bản vẽ sẽ [status] khi được dán' - sink: 'bồn rửa' + sink: 'chìm' not-sink: 'không chìm' no-clipboard: >- Không có bản thiết kế nào trong bảng diễn. Tải lên hoặc sao chép @@ -438,7 +438,7 @@ commands: rename: parameters: description: đặt tên lại một bản thiết kế - success: 'Blueprint [old] has been successfully renamed to [name].' + success: 'Bản thiết kế [old] đã được đổi tên thành [name].' pick-different-name: 'Vui lòng chỉ định một tên khác với tên hiện tại của bản thiết kế.' management: back: Trở lại @@ -459,7 +459,7 @@ commands: no-permission: Không có quyền perm-required: Yêu cầu no-perm-required: Không thể thiết lập quyền cho gói mặc định - perm-not-required: Sure! Please provide the text you'd like me to translate. + perm-not-required: Không yêu cầu perm-format: '' remove: Nhấn chuột phải để xóa blueprint-instruction: |- @@ -472,7 +472,7 @@ commands: name: quit: quit prompt: Nhập một tên, hoặc 'quit' để thoát - too-long: 'Too long' + too-long: 'Quá dài' pick-a-unique-name: Xin hãy chọn một cái tên độc đáo hơn. stripped-char-in-unique-name: >- Một số ký tự đã bị xóa vì chúng không được phép. ID mới sẽ là @@ -531,12 +531,11 @@ commands: world: description: Quản lý cài đặt thế giới delete: - parameters: - description: deletes a player's island + parameters: + description: xóa đảo của người chơi cannot-delete-owner: >- - All island members have to be kicked from the island before deleting - it. - deleted-island: 'Island at [xyz] has been successfully deleted.' + Tất cả thành viên đảo phải bị đuổi khỏi đảo trước khi xóa. + deleted-island: 'Đảo tại [xyz] đã được xóa thành công.' deletehomes: parameters: description: xoá toàn bộ nhà trong đảo @@ -544,8 +543,8 @@ commands: why: parameters: description: bật báo cáo gỡ lỗi bảo vệ bảng điều khiển - turning-on: Turning on console debug for [name]. - turning-off: Turning off console debug for [name]. + turning-on: 'Đang bật gỡ lỗi bảng điều khiển cho [name].' + turning-off: 'Đang tắt gỡ lỗi bảng điều khiển cho [name].' deaths: description: biên tập số lần chết của người chơi reset: @@ -729,8 +728,8 @@ commands: not-allowed: 'Bạn không được phép chọn điểm nhà ở Địa Ngục.' confirmation: 'Bạn có chắc muốn chọn điểm nhà ở Địa Ngục?' the-end: - not-allowed: 'Bạn không được phép chọn điểm nhà ở Thế Giới Địa Ngục.' - confirmation: 'Bạn có chắc muốn chọn điểm nhà ở Thế Giới Địa Ngục?' + not-allowed: 'Bạn không được phép chọn điểm nhà ở Thế Giới Kết Thúc.' + confirmation: 'Bạn có chắc muốn chọn điểm nhà ở Thế Giới Kết Thúc?' parameters: '[số nhà]' setname: description: đặt tên cho đảo bạn @@ -841,7 +840,7 @@ commands: invite: description: mời người chơi vào đảo của bạn invitation-sent: 'Lời mời đã gửi tới [name].' - removing-invite: 'Đang xóa lời mồi.' + removing-invite: 'Đang xóa lời mời.' name-has-invited-you: '[name] đã mời bạn vào đảo họ.' to-accept-or-reject: >- Dùng /[label] team accept để chấp nhận, hoặc /[label] team reject @@ -1126,7 +1125,7 @@ protection: description: Bật/Tắt tương tác với thùng ủ phân hint: Tương tác với thùng ủ phân đã tắt LOOM: - name: Hiện ra dệt + name: Khung dệt description: Chuyển đổi sử dụng hint: Truy cập khung dệt đã bị vô hiệu hóa FLOWER_POT: @@ -1134,7 +1133,7 @@ protection: description: Bật/Tắt tương tác với chậu hoa hint: Tương tác với chậu hoa đã tắt GRINDSTONE: - name: Mài đá + name: Bệ mài description: Chuyển đổi sử dụng hint: Truy cập bệ mài đã bị vô hiệu hóa SHULKER_BOX: @@ -1350,7 +1349,7 @@ protection: hint: Cắt gặt cây trồng đã bị vô hiệu hóa HIVE: description: 'Bật/Tắt thu hoạch tổ ong.' - name: Thu hoạch tủ ong + name: Thu hoạch tổ ong hint: Đã tắt thu hoạch tổ ong HURT_TAMED_ANIMALS: description: >- @@ -1488,7 +1487,7 @@ protection: NOTE_BLOCK: description: Bật/Tắt sử dụng name: Khối nốt nhạc - hint: Đã tắt tương tắt với khối nốt nhạc + hint: Đã tắt tương tác với khối nốt nhạc OBSIDIAN_SCOOPING: name: Xúc hắc diệm thạch description: |- @@ -1564,8 +1563,8 @@ protection: hint: Tạm dừng tăng trưởng mob đã tắt PRESSURE_PLATE: description: Bật/Tắt sử dụng - name: Đĩa cảm biến ám lực - hint: Đã tắt sử dụng đĩa cảm biến ám lực + name: Đĩa cảm biến áp lực + hint: Đã tắt sử dụng đĩa cảm biến áp lực PVP_END: description: |- Bật/Tắt PVP @@ -1697,12 +1696,12 @@ protection: Thành viên đảo vẫn mất đồ nếu họ chết ở đảo của họ! SPAWN_PROTECTION: - name: Spawn island void protection + name: Bảo vệ hư vô đảo hồi sinh description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Khi bật, người chơi rơi vào + hư vô tại đảo hồi sinh + sẽ được dịch chuyển về + điểm hồi sinh thay vì chết. RAID_TRIGGER: name: Kích hoạt cuộc đột kích description: Đặt cấp độ đảo tối thiểu cần thiết để kích hoạt cuộc đột kích @@ -1736,7 +1735,7 @@ protection: Cho phép TNT và xe mỏ có TNT phá khối gây sát thương lên khối và thực thể ở ngoài đảo. - name: Sát thường từ TNT ngoài đảo + name: Sát thương từ TNT ngoài đảo locked: 'Đảo đã khóa!' locked-island-bypass: '[prefix_Island] này đã bị khóa, nhưng bạn có quyền đi qua.' protected: 'Đảo đã bảo vệ: [description].' @@ -1887,7 +1886,7 @@ management: name: 'Mục lục tiện ích' description: 'Mở mục lục tiện ích' credits: - name: 'Đống góp' + name: 'Đóng góp' description: 'Mở menu đóng góp cho BentoBox' empty-here: name: 'Hơi trống ở đây...' @@ -1903,7 +1902,7 @@ management: phần mềm và phiên bản TƯƠNG THÍCH . Tất cả tính năng được tạo - đệ chạy trên môi trường này. + để chạy trên môi trường này. SUPPORTED: | Đang chạy [name] [version]. @@ -2000,14 +1999,14 @@ enums: WORLD_BORDER: Biên Giới Thế Giới panel: credits: - title: '[name] Đống góp' + title: '[name] Đóng góp' contributor: name: '[name]' description: 'Cam kết: [commits]' empty-here: name: 'Hơi trống ở đây...' description: | - BentoBox không thể lấy người đống góp + BentoBox không thể lấy người đóng góp cho tiện ích này. Cho phép BentoBox kết nối GitHub trong From 833916ac5dc43cb9fd4b10c95e45878b84fe8ca7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:22:08 -0700 Subject: [PATCH 46/95] Fix Indonesian (id.yml) locale: broken color codes, untranslated strings, wrong translations, translated placeholders - Fix ~50 broken legacy color codes (&sebuah, & satu, etc.) replaced with proper MiniMessage tags across flag descriptions (CONTAINER, BLOCK_EXPLODE_DAMAGE, CLEAN_SUPER_FLAT, CREEPER_DAMAGE, ENDERMAN_DEATH_DROP, GEO_LIMIT_MOBS, HARVEST, PISTON_PUSH, TREES_GROWING_OUTSIDE_RANGE, WITHER_DAMAGE, etc.) - Translate untranslated English: maxsize section, SPAWN_PROTECTION flag, Max homes - Fix translated placeholders back to English: [nama]->[name], [angka]->[number], [deskripsi]->[description], [pengguna]->[user], [versi]->[version], [peringkat]->[rank], [pengaturan]->[setting], [berikutnya]->[next], [nama_dunia]->[world_name], [tambahan]->[addon], [dunia]->[worlds], [mode permainan]->[gamemode] - Fix wrong translations: PVT->PVP, cat dasar->pemasangan sumbu (TNT priming), Buah paduan suara->Buah Chorus, gerbong->Hopper, Perapian->Tungku, Kebiasaan->Kustom, SKS->Kredit, Mengurung->Coop, Serangan Massa->Serangan Entitas, Batu Merah Luar Talian->Redstone Offline, Tempat pembuatan bir->ramuan, Kerusakan Dada->Kerusakan Peti, Bibit dilindungi->Spawn dilindungi - Fix broken flag-item name-layout and contributor name from '&sebuah nama]' to proper '[name]' - Fix broken reset-to-default description with truncated 'ilai bawaan' - Fix dimension-done and see-console-for-status broken color codes - Fix team fix done from '& Pemindaian' to proper tagged string Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/id.yml | 360 +++++++++++++++--------------- 1 file changed, 179 insertions(+), 181 deletions(-) diff --git a/src/main/resources/locales/id.yml b/src/main/resources/locales/id.yml index b0084f0c8..f92dbcadb 100644 --- a/src/main/resources/locales/id.yml +++ b/src/main/resources/locales/id.yml @@ -121,9 +121,7 @@ commands: number-error: 'Argumen harus beberapa hari' confirm: 'Ketik /[label] purge konfirmasi untuk memulai pembersihan' completed: 'Pembersihan dihentikan.' - see-console-for-status: >- - & Pembersihan dimulai. Lihat konsol untuk status atau gunakan - /[label] purge status. + see-console-for-status: 'Pembersihan dimulai. Lihat konsol untuk status atau gunakan /[label] purge status.' no-purge-in-progress: 'Saat ini tidak ada pembersihan yang sedang berlangsung.' regions: parameters: '[days]' @@ -165,11 +163,11 @@ commands: description: memindai dan memperbaiki keanggotaan lintas pulau dalam database scanning: Memindai basis data... duplicate-owner: 'Pemain memiliki lebih dari satu pulau di database: [name]' - player-has: 'Pemain [nama] memiliki [nomor] pulau' + player-has: 'Pemain [name] memiliki [number] pulau' duplicate-member: 'Pemain [name] adalah anggota lebih dari satu pulau di database' rank-on-island: '[rank] di pulau di [xyz]' fixed: 'Tetap' - done: '& Pemindaian' + done: 'Pemindaian' kick: parameters: description: menendang pemain dari tim @@ -193,10 +191,10 @@ commands: Peringatan: pemain ini sekarang memiliki [number] pulau. Ini lebih dari yang diizinkan oleh pengaturan atau izin: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: Atur ukuran tim maksimum untuk [prefix_island] pemain (gunakan 0 untuk mengatur ulang ke default dunia) + success: 'Atur ukuran tim maksimum [prefix_island] [name] menjadi [number].' + reset: 'Atur ulang ukuran tim maksimum [prefix_island] [name] ke default dunia ([number]).' range: description: perintah jangkauan pulau admin invalid-value: @@ -224,7 +222,7 @@ commands: reset: parameters: description: mengatur ulang rentang pulau yang dilindungi ke default dunia - success: 'Setel ulang rentang perlindungan pulau ke [angka].' + success: 'Setel ulang rentang perlindungan pulau ke [number].' add: description: meningkatkan jangkauan pulau yang dilindungi parameters: @@ -241,7 +239,7 @@ commands: parameters: description: daftarkan pemain ke pulau tak berpemilik tempat Anda berada registered-island: 'Terdaftar [name] ke pulau di [xyz].' - reserved-island: 'Pulau yang dilindungi di [xyz] untuk [nama].' + reserved-island: 'Pulau yang dilindungi di [xyz] untuk [name].' already-owned: 'Pulau sudah dimiliki oleh pemain lain!' no-island-here: 'Tidak ada pulau di sini. Konfirmasikan untuk membuatnya.' in-deletion: 'Ruang pulau ini sedang dihapus. Coba nanti.' @@ -272,7 +270,7 @@ commands: last-login-date-time-format: EEE MMM dd HH:mm:ss zzz yyyy deaths: 'Kematian: [number]' resets-left: 'Reset: [number] (Maks: [total])' - max-homes: 'Max homes: [number]' + max-homes: 'Rumah maksimum: [number]' team-members-title: 'Anggota Tim:' team-owner-format: '[name] [rank]' team-member-format: '[name] [rank]' @@ -291,7 +289,7 @@ commands: protection-coords: 'Koordinat perlindungan: [xz1] hingga [xz2]' is-spawn: Pulau adalah pulau bibit banned-players: 'Pemain yang dilarang:' - banned-format: '[nama]' + banned-format: '[name]' unowned: 'Tidak dimiliki' bundle: 'Paket Blueprint yang digunakan untuk membuat pulau: [name]' switch: @@ -372,7 +370,7 @@ commands: confirmation: 'Apakah Anda yakin ingin menetapkan [xyz] sebagai pusat perlindungan?' success: 'Berhasil menetapkan [xyz] sebagai pusat perlindungan.' fail: 'Gagal menetapkan [xyz] sebagai pusat perlindungan.' - island-location-changed: '[pengguna] mengubah pusat perlindungan pulau menjadi [xyz].' + island-location-changed: '[user] mengubah pusat perlindungan pulau menjadi [xyz].' xyz-error: 'Tentukan tiga koordinat bilangan bulat: misalnya 100 120 100' setspawn: description: tetapkan pulau sebagai tempat bertelur untuk mode permainan ini @@ -391,7 +389,7 @@ commands: Apakah Anda yakin ingin menetapkan lokasi ini sebagai titik pemijahan pulau ini? success: 'Berhasil menetapkan lokasi ini sebagai titik pemijahan pulau ini.' - island-spawnpoint-changed: '[pengguna] mengubah titik spawn pulau.' + island-spawnpoint-changed: '[user] mengubah titik spawn pulau.' settings: parameters: >- [player]/[world flag]/spawn-island [flag/active/disable] @@ -607,8 +605,8 @@ commands: locales-reloaded: '[prefix_bentobox]Bahasa dimuat ulang.' addons-reloaded: '[prefix_bentobox]Tambahan dimuat ulang.' settings-reloaded: '[prefix_bentobox]Pengaturan dimuat ulang.' - addon: '[prefix_bentobox]Memuat ulang [nama].' - addon-reloaded: '[prefix_bentobox][nama] dimuat ulang.' + addon: '[prefix_bentobox]Memuat ulang [name].' + addon-reloaded: '[prefix_bentobox][name] dimuat ulang.' warning: >- [prefix_bentobox]Peringatan: Memuat ulang dapat menyebabkan ketidakstabilan, jadi jika Anda melihat kesalahan setelahnya, mulai @@ -622,7 +620,7 @@ commands: loaded-addons: 'Add-on yang Dimuat:' loaded-game-worlds: 'Dunia Game yang Dimuat:' addon-syntax: '[name] [version] ([state])' - game-world: '[nama] ([tambahan]): [dunia]' + game-world: '[name] ([addon]): [worlds]' server: 'Menjalankan [name] [version].' database: 'Basis Data: [database]' manage: @@ -641,7 +639,7 @@ commands: players: '[prefix_bentobox]Memigrasikan pemain' names: '[prefix_bentobox]Memigrasikan nama' addons: '[prefix_bentobox]Memigrasi add-on' - class: '[prefix_bentobox]Migrasi [deskripsi]' + class: '[prefix_bentobox]Migrasi [description]' migrated: '[prefix_bentobox]Bermigrasi' completed: '[prefix_bentobox]Selesai' rank: @@ -695,9 +693,9 @@ commands: mereka [prefix_island]. pasting: estimated-time: 'Perkiraan waktu: [number] detik.' - blocks: 'Membangunnya blok demi blok: [angka] blok semuanya...' + blocks: 'Membangunnya blok demi blok: [number] blok semuanya...' entities: 'Mengisinya dengan entitas: [number] entitas di semua...' - dimension-done: '&sebuah Pulau di [world] dibangun.' + dimension-done: '[prefix_Island] di [world] dibangun.' done: 'Selesai! Pulau Anda sudah siap dan menunggu Anda!' pick: 'Pilih pulau' cannot-afford: 'Anda tidak mampu membeli ini! Biaya: [cost]' @@ -738,7 +736,7 @@ commands: Tidak ada jalan untuk kembali: setelah pulau Anda saat ini dihapus, tidak ada cara untuk mengambilnya kembali nanti. kicked-from-island: >- - Anda dikeluarkan dari pulau Anda dalam [mode permainan] karena + Anda dikeluarkan dari pulau Anda dalam [gamemode] karena pemiliknya menyetel ulang. sethome: description: atur titik teleportasi rumah Anda @@ -758,7 +756,7 @@ commands: setname: description: tetapkan nama untuk pulau Anda name-too-short: 'Terlalu pendek. Ukuran minimum adalah [number] karakter.' - name-too-long: 'Terlalu panjang. Ukuran maksimum adalah [angka] karakter.' + name-too-long: 'Terlalu panjang. Ukuran maksimum adalah [number] karakter.' name-already-exists: 'Sudah ada pulau dengan nama itu di mode permainan ini.' parameters: success: 'Berhasil menetapkan nama pulau Anda menjadi [name].' @@ -822,7 +820,7 @@ commands: Anggota: [total]/[max] Anggota daring: [online] rank-layout: - owner: '[peringkat]:' + owner: '[rank]:' generic: '[rank] ([number]):' coop: description: buat peringkat coop pemain di pulaumu @@ -851,11 +849,11 @@ commands: parameters: trust-in-yourself: 'Percayalah pada dirimu sendiri!' name-has-invited-you: >- - [nama] telah mengundang Anda untuk bergabung sebagai anggota + [name] telah mengundang Anda untuk bergabung sebagai anggota tepercaya di pulau mereka. player-already-trusted: 'Pemain sudah dipercaya!' you-are-trusted: 'Anda dipercaya oleh [name]!' - success: 'Anda mempercayai [nama].' + success: 'Anda mempercayai [name].' is-full: 'Anda tidak bisa mempercayai orang lain. Awasi punggungmu!' untrust: description: hapus peringkat pemain tepercaya dari pemain @@ -982,8 +980,8 @@ commands: Anda telah mencapai batas larangan, Anda tidak dapat melarang pemain lain lagi dari pulau Anda. player-already-banned: 'Pemain sudah diblokir.' - player-banned: '[nama]sekarang dilarang di pulau Anda.' - owner-banned-you: '[nama]melarang Anda memasuki pulau mereka!' + player-banned: '[name] sekarang dilarang di pulau Anda.' + owner-banned-you: '[name] melarang Anda memasuki pulau mereka!' you-are-banned: 'Anda dilarang memasuki pulau ini!' unban: description: batalkan pelarangan pemain dari pulau Anda @@ -991,13 +989,13 @@ commands: cannot-unban-yourself: 'Anda tidak dapat membatalkan pemblokiran diri Anda sendiri!' player-not-banned: 'Pemain tidak dilarang.' player-unbanned: '[name]kini tidak diblokir lagi di pulau Anda.' - you-are-unbanned: '[nama]membatalkan pemblokiran Anda dari pulau mereka!' + you-are-unbanned: '[name] membatalkan pemblokiran Anda dari pulau mereka!' banlist: description: daftar pemain yang dilarang noone: 'Tidak ada yang dilarang di pulau ini.' the-following: 'Pemain berikut dilarang:' names: '[line]' - you-can-ban: 'Anda dapat melarang hingga [angka] lebih banyak pemain.' + you-can-ban: 'Anda dapat melarang hingga [number] lebih banyak pemain.' settings: description: menampilkan pengaturan pulau language: @@ -1012,8 +1010,8 @@ commands: cannot-expel: 'Pemain itu tidak bisa dikeluarkan.' cannot-expel-member: 'Anda tidak dapat mengeluarkan anggota tim!' not-on-island: 'Pemain itu tidak ada di pulau Anda!' - player-expelled-you: '[nama]mengusirmu dari pulau!' - success: 'Anda mengusir [nama] dari pulau.' + player-expelled-you: '[name] mengusirmu dari pulau!' + success: 'Anda mengusir [name] dari pulau.' lock: description: kunci atau buka kunci [prefix_island] Anda locked: '[prefix_island] Anda sekarang terkunci.' @@ -1024,7 +1022,7 @@ ranks: sub-owner: Sub-Pemilik member: Anggota trusted: Tepercaya - coop: Mengurung + coop: Coop visitor: Pengunjung banned: Dilarang admin: Admin @@ -1100,12 +1098,12 @@ protection: hint: Peternakan hewan dilindungi BREWING: description: Alihkan interaksi - name: Tempat pembuatan bir - hint: Pembuatan bir dinonaktifkan + name: Tempat pembuatan ramuan + hint: Pembuatan ramuan dinonaktifkan BUCKET: description: Alihkan interaksi name: ember - hint: Penggunaan keranjang dinonaktifkan + hint: Penggunaan ember dinonaktifkan BUTTON: description: Alihkan penggunaan tombol name: Tombol @@ -1127,10 +1125,10 @@ protection: description: |- Alihkan interaksi dengan semua penampung. Termasuk: Barel, sarang lebah, tempat pembuatan bir, - & peti, komposter, dispenser, penetes, - & pot bunga, tungku, hopper, bingkai barang, - &sebuah jukebox, peti kereta tambang, kotak shulker, - & dada yang terperangkap. + peti, komposter, dispenser, penetes, + pot bunga, tungku, hopper, bingkai barang, + jukebox, peti kereta tambang, kotak shulker, + peti yang terperangkap. Mengubah penggantian pengaturan individual bendera ini. @@ -1141,7 +1139,7 @@ protection: Beralih interaksi dengan peti dan kereta tambang peti. (tidak termasuk peti yang terperangkap) - hint: Akses dada dinonaktifkan + hint: Akses peti dinonaktifkan BARREL: name: barel description: Alihkan interaksi barel @@ -1154,8 +1152,8 @@ protection: description: |- Izinkan Tempat Tidur & Respawn Jangkar untuk memecahkan blok dan merusak - &sebuah entitas. - name: Blokir kerusakan ledakan + entitas. + name: Kerusakan ledakan blok COMPOSTER: name: Komposter description: Alihkan interaksi komposter @@ -1191,8 +1189,8 @@ protection: hint: Akses pemotongan batu dinonaktifkan TRAPPED_CHEST: name: Peti yang terperangkap - description: Alihkan interaksi dada yang terjebak - hint: Akses dada yang terjebak dinonaktifkan + description: Alihkan interaksi peti yang terperangkap + hint: Akses peti yang terperangkap dinonaktifkan DISPENSER: name: Dispenser description: Alihkan interaksi dispenser @@ -1206,27 +1204,27 @@ protection: description: Alihkan elytra diperbolehkan atau tidak hint: 'PERINGATAN: Elytra tidak dapat digunakan di sini!' HOPPER: - name: gerbong + name: Hopper description: Alihkan interaksi hopper hint: Interaksi hopper dinonaktifkan CHEST_DAMAGE: - description: Alihkan kerusakan dada akibat ledakan - name: Kerusakan Dada + description: Alihkan kerusakan peti akibat ledakan + name: Kerusakan Peti CHORUS_FRUIT: description: Alihkan teleportasi - name: Buah paduan suara - hint: Teleportasi buah paduan suara dinonaktifkan + name: Buah Chorus + hint: Teleportasi buah Chorus dinonaktifkan CLEAN_SUPER_FLAT: description: |- Aktifkan untuk membersihkan apa pun - & potongan super datar - &sebuah dunia pulau + potongan super datar di + dunia [prefix_island] name: Bersih Super Datar COARSE_DIRT_TILLING: description: |- - Alihkan pengolahan kasar - &sebuah podzol yang kotor dan pecah - untuk mendapatkan kotoran + Alihkan pengolahan tanah kasar + dan pemecahan podzol + untuk mendapatkan tanah name: Pengolahan tanah kasar hint: Tidak ada tanah kasar yang diolah COLLECT_LAVA: @@ -1256,18 +1254,18 @@ protection: hint: Akses meja kerja dinonaktifkan CREEPER_DAMAGE: description: | - Alihkan tanaman menjalar - & perlindungan kerusakan - name: Perlindungan kerusakan menjalar + Alihkan kerusakan + creeper. + name: Kerusakan creeper CREEPER_GRIEFING: description: | - Mengalihkan kesedihan yang menjalar - & perlindungan saat dinyalakan - oleh pengunjung pulau. - name: Perlindungan kesedihan yang menjalar - hint: Creeper berduka dinonaktifkan + Alihkan perlindungan griefing + creeper saat dinyalakan + oleh pengunjung [prefix_island]. + name: Perlindungan griefing creeper + hint: Griefing creeper dinonaktifkan CROP_PLANTING: - description: '&Satu Set yang bisa menanam benih.' + description: 'Atur siapa yang bisa menanam benih.' name: Penanaman tanaman hint: Penanaman tanaman dinonaktifkan CROP_TRAMPLE: @@ -1304,14 +1302,14 @@ protection: hint: Peti Ender dinonaktifkan di dunia ini ENDERMAN_DEATH_DROP: description: |- - Endermen akan jatuh - i blok mana pun mereka berada - &penahanan jika dibunuh. + Endermen akan menjatuhkan + blok apa pun yang mereka + pegang jika dibunuh. name: Penurunan Kematian Enderman ENDERMAN_GRIEFING: description: |- - Endermen dapat menghapus - & satu blok dari pulau + Endermen dapat mengambil + blok dari pulau name: Enderman berduka ENDERMAN_TELEPORT: description: |- @@ -1324,14 +1322,14 @@ protection: hint: Penggunaan Enderpearl dinonaktifkan ENTER_EXIT_MESSAGES: description: Menampilkan pesan masuk dan keluar - island: pulau [nama]. + island: pulau [name]. name: Masuk/Keluar pesan - now-entering: 'Sekarang masuk [nama].' + now-entering: 'Sekarang masuk [name].' now-entering-your-island: 'Sekarang memasuki pulau Anda.' - now-leaving: 'Sekarang meninggalkan [nama].' + now-leaving: 'Sekarang meninggalkan [name].' now-leaving-your-island: 'Sekarang tinggalkan pulau Anda.' EXPERIENCE_BOTTLE_THROWING: - name: Rasakan pengalaman melempar botol + name: Melempar botol pengalaman description: Beralih melempar botol pengalaman. hint: Botol pengalaman dinonaktifkan FIRE_BURNING: @@ -1361,12 +1359,12 @@ protection: name: batu dan baja description: |- Izinkan pemain menyalakan api atau - & api unggun menggunakan batu api dan baja - atau biaya kebakaran. + api unggun menggunakan batu api dan baja + atau muatan api. hint: Batu api dan baja serta muatan api dinonaktifkan FURNACE: description: Alihkan penggunaan - name: Perapian + name: Tungku hint: Penggunaan tungku dinonaktifkan GATE: description: Alihkan penggunaan @@ -1374,15 +1372,15 @@ protection: hint: Penggunaan gerbang dinonaktifkan GEO_LIMIT_MOBS: description: |- - Hapus massa yang pergi - & dilindungi dari luar - & ruang pulau + Hapus mob yang keluar + dari ruang [prefix_island] + yang dilindungi name: 'Batasi massa di pulau' HARVEST: description: |- - &Satu set yang bisa memanen tanaman. - Jangan lupa untuk mengizinkan item - & penjemputan juga! + Atur siapa yang bisa memanen tanaman. + Jangan lupa untuk mengizinkan pengambilan + item juga! name: Panen tanaman hint: Pemanenan tanaman dinonaktifkan HIVE: @@ -1394,7 +1392,7 @@ protection: Alihkan rasa sakit. Diaktifkan berarti bahwa hewan peliharaan dapat menerima damage. Dinonaktifkan berarti mereka tidak bisa terluka. name: Luka hewan peliharaan - hint: Hewan jinak melukai dinonaktifkan + hint: Menyakiti hewan jinak dinonaktifkan HURT_ANIMALS: description: Alihkan rasa sakit name: Menyakiti binatang @@ -1406,7 +1404,7 @@ protection: HURT_VILLAGERS: description: Alihkan rasa sakit name: Menyakiti penduduk desa - hint: Penduduk desa melukai orang cacat + hint: Menyakiti penduduk desa dinonaktifkan ITEM_FRAME: name: Bingkai Barang description: |- @@ -1415,8 +1413,8 @@ protection: hint: Penggunaan Bingkai Item dinonaktifkan ITEM_FRAME_DAMAGE: description: |- - Massa dapat merusak - & bingkai item + Mob dapat merusak + bingkai item name: Kerusakan Bingkai Barang INVINCIBLE_VISITORS: description: |- @@ -1464,8 +1462,8 @@ protection: LIMIT_MOBS: description: |- Batasi entitas dari - & pemijahan dalam game ini - & sebuah modus. + pemijahan dalam mode + permainan ini. name: 'Batasi pemijahan tipe entitas' can: 'Dapat bertelur' cannot: 'Tidak dapat muncul' @@ -1475,8 +1473,8 @@ protection: Beralih apakah cairan dapat mengalir ke luar dari jangkauan perlindungan pulau. Menonaktifkannya membantu menghindari lahar dan air - & batu besar yang menghasilkan di area antara - & dua pulau. + menghasilkan batu besar di area antara + dua [prefix_island]. Perhatikan bahwa cairan akan tetap mengalir secara vertikal. Mereka juga tidak akan menyebar secara horizontal jika @@ -1488,8 +1486,8 @@ protection: CHANGE_SETTINGS: name: Ubah pengaturan description: |- - Izinkan untuk berpindah anggota yang mana - &peran dapat mengubah pengaturan pulau. + Izinkan untuk berpindah peran anggota + yang mana dapat mengubah pengaturan [prefix_island]. MILKING: description: Alihkan pemerahan sapi name: Pemerahan @@ -1502,7 +1500,7 @@ protection: hint: Interaksi kereta tambang dinonaktifkan MONSTER_NATURAL_SPAWN: description: Alihkan pemijahan monster secara alami - name: Monster bertelur secara alami + name: Pemijahan monster alami MONSTER_SPAWNERS_SPAWN: description: Alihkan pemijahan monster dengan pemijahan name: Pemijahan monster @@ -1524,8 +1522,8 @@ protection: jangkauan perlindungan sebuah pulau. Perhatikan bahwa itu tidak mencegah makhluk - untuk bertelur melalui mob spawner atau spawn - & c telur. + untuk bertelur melalui mob spawner atau + telur spawn. NOTE_BLOCK: description: Alihkan penggunaan name: Blok catatan @@ -1561,19 +1559,19 @@ protection: di mana semua anggota sedang offline. Dapat membantu mengurangi kelambatan. Tidak memengaruhi pulau pemijahan. - name: Batu Merah Luar Talian + name: Redstone Offline PETS_STAY_AT_HOME: description: |- Saat aktif, hewan peliharaan yang dijinakkan hanya dapat pergi ke dan - tidak bisa meninggalkan milik pemiliknya - & pulau asal. + tidak bisa meninggalkan + [prefix_island] asal pemiliknya. name: Hewan Peliharaan Tetap Di Rumah PISTON_PUSH: description: |- Aktifkan ini untuk mencegah - & piston dari dorongan - &satu blok di luar pulau + piston mendorong + blok ke luar [prefix_island] name: Perlindungan Dorong Piston PLACE_BLOCKS: description: Alihkan penempatan @@ -1612,17 +1610,17 @@ protection: hint: Penggunaan pelat tekanan dinonaktifkan PVP_END: description: |- - Aktifkan/Nonaktifkan PVT - pada akhirnya. - name: Akhiri PVP - hint: PVP dinonaktifkan pada akhirnya - enabled: 'PVP di Akhir telah diaktifkan.' - disabled: 'PVP pada akhirnya telah dinonaktifkan.' + Aktifkan/Nonaktifkan PVP + di End. + name: PVP End + hint: PVP dinonaktifkan di End + enabled: 'PVP di End telah diaktifkan.' + disabled: 'PVP di End telah dinonaktifkan.' PVP_NETHER: description: |- Aktifkan/Nonaktifkan PVP di Nether. - name: PVT Bawah + name: PVP Nether hint: PVP dinonaktifkan di Nether enabled: 'PVP di Nether telah diaktifkan.' disabled: 'PVP di Nether telah dinonaktifkan.' @@ -1640,14 +1638,14 @@ protection: hint: Interaksi Redstone dinonaktifkan REMOVE_END_EXIT_ISLAND: description: |- - Mencegah keluarnya akhir - &sebuah pulau dari pembangkitan + Mencegah [prefix_island] keluar + akhir dari dibuat pada koordinat 0,0 name: Hapus pulau keluar ujung REMOVE_MOBS: description: |- - Hapus monster kapan - &teleportasi ke pulau + Dorong monster menjauh saat + berteleportasi ke pulau name: Hapus monster RIDING: description: Beralih berkendara @@ -1659,47 +1657,47 @@ protection: hint: Geser dinonaktifkan SPAWN_EGGS: description: Alihkan penggunaan - name: Menelurkan telur - hint: Telur bertelur dinonaktifkan + name: Telur spawn + hint: Telur spawn dinonaktifkan SPAWNER_SPAWN_EGGS: description: |- Memungkinkan untuk mengubah tipe entitas spawner menggunakan telur bibit. - name: Menelurkan telur pada spawner + name: Telur spawn pada spawner hint: >- mengubah tipe entitas pemijahan menggunakan telur pemijahan tidak diperbolehkan SCULK_SENSOR: description: |- - Mengaktifkan sensor sculk - & aktivasi. + Mengalihkan aktivasi + sensor sculk. name: Sensor Sculk hint: aktivasi sensor sculk dinonaktifkan SCULK_SHRIEKER: description: |- - Mengalihkan jeritan sculk - & aktivasi. + Mengalihkan aktivasi + sculk shrieker. name: Sculk Shrieker hint: aktivasi sculk shrieker dinonaktifkan SIGN_EDITING: description: |- Memungkinkan pengeditan teks tanda - name: Pengeditan Tanda Tangan + name: Pengeditan Papan Tanda hint: pengeditan tanda dinonaktifkan TNT_DAMAGE: description: |- Izinkan kereta tambang TNT dan TNT untuk memecahkan blok dan merusak - &sebuah entitas. + entitas. name: kerusakan TNT TNT_PRIMING: description: |- Mencegah priming TNT. Ini tidak mengesampingkan Pelindung batu dan baja. - name: cat dasar TNT - hint: Cat dasar TNT dinonaktifkan + name: Pemasangan sumbu TNT + hint: Pemasangan sumbu TNT dinonaktifkan TRADING: description: Beralih perdagangan name: Perdagangan penduduk desa @@ -1711,12 +1709,12 @@ protection: TREES_GROWING_OUTSIDE_RANGE: name: Pohon yang tumbuh di luar jangkauan description: |- - Beralih apakah pohon dapat tumbuh di luar an - & jangkauan perlindungan suatu pulau atau tidak. - Tidak hanya akan mencegah penempatan anakan - di luar jangkauan perlindungan pulau - & terus berkembang, namun hal ini juga akan menghambat generasi - dedaunan/batang kayu di luar pulau, demikian + Alihkan apakah pohon dapat tumbuh di luar + jangkauan perlindungan [prefix_island] atau tidak. + Tidak hanya akan mencegah anakan + di luar jangkauan perlindungan [prefix_island] + terus berkembang, tetapi juga akan menghambat pembuatan + dedaunan/batang kayu di luar [prefix_island], sehingga menebang pohon. TURTLE_EGGS: description: Alihkan penghancuran @@ -1727,9 +1725,9 @@ protection: name: Pejalan Beku hint: Frost Walker dinonaktifkan EXPERIENCE_PICKUP: - name: Pengalaman penjemputan + name: Pengambilan pengalaman description: Alihkan pengambilan bola pengalaman - hint: Penjemputan pengalaman dinonaktifkan + hint: Pengambilan pengalaman dinonaktifkan PREVENT_TELEPORT_WHEN_FALLING: name: Mencegah teleport ketika terjatuh description: |- @@ -1738,21 +1736,21 @@ protection: jika mereka jatuh. hint: 'Anda tidak dapat melakukan itu sambil jatuh.' VISITOR_KEEP_INVENTORY: - name: Pengunjung menyimpan inventaris kematian + name: Pengunjung menyimpan inventaris saat mati description: |- - Mencegah pemain kehilangan miliknya - &sebuah item dan pengalaman jika mereka mati - &sebuah pulau tempat mereka menjadi pengunjung. + Mencegah pemain kehilangan + item dan pengalaman jika mereka mati di + [prefix_an-island] tempat mereka menjadi pengunjung. - Anggota pulau masih kehilangan item mereka - jika mereka mati di pulau mereka sendiri! + Anggota [prefix_Island] masih kehilangan item mereka + jika mereka mati di [prefix_island] mereka sendiri! SPAWN_PROTECTION: - name: Spawn island void protection + name: Perlindungan void pulau spawn description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Jika diaktifkan, pemain yang jatuh + ke dalam void di pulau spawn + akan diteleportasi kembali ke + titik spawn alih-alih mati. RAID_TRIGGER: name: Pemicu penggerebekan description: Menetapkan peringkat pulau minimum yang diperlukan untuk memicu penggerebekan @@ -1762,7 +1760,7 @@ protection: description: |- Beralih jika entitas (non-pemain) bisa gunakan portal untuk berteleportasi - &sebuah dimensi + antar dimensi WIND_CHARGE: name: Muatan angin description: |- @@ -1771,27 +1769,27 @@ protection: dapat menggunakan muatan angin di pulau ini. hint: Penggunaan muatan angin dinonaktifkan WITHER_DAMAGE: - name: Alihkan kerusakan layu + name: Alihkan kerusakan wither description: |- - Kalau aktif, layu bisa - & blok kerusakan dan pemain + Jika aktif, wither dapat + merusak blok dan pemain WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Izinkan Tempat Tidur & Respawn Jangkar untuk memecahkan blok dan merusak - &sebuah entitas di luar batas pulau. + entitas di luar batas [prefix_island]. name: Kerusakan ledakan blok dunia WORLD_TNT_DAMAGE: description: |- Izinkan kereta tambang TNT dan TNT untuk memecahkan blok dan merusak - &sebuah entitas di luar batas pulau. + entitas di luar batas [prefix_island]. name: Kerusakan TNT dunia locked: 'Pulau ini terkunci!' locked-island-bypass: '[prefix_Island] ini terkunci, tetapi kamu memiliki izin untuk melewatinya.' - protected: 'Pulau dilindungi: [deskripsi].' - world-protected: 'Dunia dilindungi: [deskripsi].' - spawn-protected: 'Bibit dilindungi: [deskripsi].' + protected: '[prefix_Island] dilindungi: [description].' + world-protected: 'Dunia dilindungi: [description].' + spawn-protected: 'Spawn dilindungi: [description].' panel: next: 'Halaman Berikutnya' previous: 'Halaman Sebelumnya' @@ -1805,12 +1803,12 @@ protection: expert: name: 'Pengaturan Pakar' description: 'Menampilkan semua pengaturan yang tersedia.' - click-to-switch: 'Klik untuk beralih ke [berikutnya].' + click-to-switch: 'Klik untuk beralih ke [next].' reset-to-default: name: 'Atur ulang ke default' description: | - Menyetel ulang SEMUA pengaturan ke pengaturannya - ilai bawaan. + Menyetel ulang SEMUA pengaturan ke + nilai bawaannya. confirm: konfirmasi instructions: >- Apakah Anda yakin? Ketik "konfirmasi" untuk mengatur ulang @@ -1826,15 +1824,15 @@ protection: Pengaturan umum untuk pulau ini WORLD_SETTING: - title: '[nama_dunia] Pengaturan' + title: '[world_name] Pengaturan' description: 'Pengaturan untuk dunia game ini' WORLD_DEFAULTS: - title: '[nama_dunia] Perlindungan Dunia' + title: '[world_name] Perlindungan Dunia' description: | - Pengaturan perlindungan kapan - &seorang pemain berada di luar pulau mereka + Pengaturan perlindungan saat + pemain berada di luar [prefix_island] mereka flag-item: - name-layout: '&sebuah nama]' + name-layout: '[name]' command-instructions: setname: |- Pilih pangkat yang dapat @@ -1907,7 +1905,7 @@ protection: Klik untuk beralih. - Pengaturan saat ini: [pengaturan] + Pengaturan saat ini: [setting] setting-active: 'Aktif' setting-disabled: 'Dinonaktifkan' management: @@ -1939,7 +1937,7 @@ management: name: 'Katalog Tambahan' description: 'Membuka Katalog Addons' credits: - name: 'SKS' + name: 'Kredit' description: 'Membuka Kredit untuk BentoBox' empty-here: name: 'Ini terlihat kosong di sini...' @@ -1951,27 +1949,27 @@ management: COMPATIBLE: | Menjalankan [name] [version]. - BentoBox sedang berjalan di a - KOMPATIBEL &perangkat lunak server dan - &sebuah versi. + BentoBox sedang berjalan pada + KOMPATIBEL perangkat lunak server dan + versi. Fitur-fiturnya dirancang sepenuhnya untuk - erlari di lingkungan ini. + berjalan di lingkungan ini. SUPPORTED: | Menjalankan [name] [version]. - BentoBox sedang berjalan di a - DIDUKUNG &perangkat lunak server dan - &sebuah versi. + BentoBox sedang berjalan pada + DIDUKUNG perangkat lunak server dan + versi. Sebagian besar fiturnya akan berjalan dengan lancar di lingkungan ini. NOT_SUPPORTED: | Menjalankan [name] [version]. - BentoBox sedang berjalan di a - TIDAK DIDUKUNG &perangkat lunak server atau - &sebuah versi. + BentoBox sedang berjalan pada + TIDAK DIDUKUNG perangkat lunak server atau + versi. Meskipun sebagian besar fiturnya akan berjalan dengan benar, bug khusus platform atau @@ -1979,9 +1977,9 @@ management: INCOMPATIBLE: | Menjalankan [name] [version]. - BentoBox saat ini berjalan di - TIDAK SESUAI &perangkat lunak server atau - &sebuah versi. + BentoBox saat ini berjalan pada + TIDAK KOMPATIBEL perangkat lunak server atau + versi. Perilaku aneh dan bug dapat terjadi dan sebagian besar fitur mungkin tidak stabil. @@ -1996,12 +1994,12 @@ catalog: name: 'Mode permainan' description: | Klik untuk menelusuri - & Gamemode resmi yang tersedia. + Gamemode resmi yang tersedia. addons: name: 'Tambahan' description: | Klik untuk menelusuri - & Addons resmi yang tersedia. + Addons resmi yang tersedia. icon: description-template: | [topic] @@ -2010,7 +2008,7 @@ catalog: [description] Klik untuk mendapatkan tautan ke - & rilis terbaru. + rilis terbaru. already-installed: Sudah terpasang! install-now: Instal sekarang! empty-here: @@ -2023,7 +2021,7 @@ catalog: enums: DamageCause: CONTACT: Kontak - ENTITY_ATTACK: Serangan Massa + ENTITY_ATTACK: Serangan Entitas ENTITY_SWEEP_ATTACK: Serangan Sapu PROJECTILE: Proyektil SUFFOCATION: Mati lemas @@ -2045,7 +2043,7 @@ enums: FALLING_BLOCK: Blok Jatuh THORNS: duri DRAGON_BREATH: Nafas Naga - CUSTOM: Kebiasaan + CUSTOM: Kustom FLY_INTO_WALL: Terbang Ke Dinding HOT_FLOOR: Lantai Panas CRAMMING: menjejalkan @@ -2056,9 +2054,9 @@ enums: WORLD_BORDER: Batas Dunia panel: credits: - title: '[nama] SKS' + title: '[name] Kredit' contributor: - name: '&sebuah nama]' + name: '[name]' description: | Melakukan: [commits] empty-here: @@ -2153,5 +2151,5 @@ successfully-loaded: | | _ \ | | | _ \ oleh tastybento dan Poslovitch | |_) | ___ _ __ | |_ ___ | |_) | _____ __ 2017 - 2023 | _ < / _ \ '_ \| __/ _ \| _ < / _ \ \/ / - | |_) | __/ | | | || (_) | |_) | (_) > < v[versi] + | |_) | __/ | | | || (_) | |_) | (_) > < v[version] |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Dimuat dalam [time]ms. From 3752e1fb8f9a21dce31c305ac825c0d2ef1ce24f Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:22:47 -0700 Subject: [PATCH 47/95] Fix Traditional Chinese HK (zh-HK.yml) locale: translate English strings, fix wrong translations and broken tags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate untranslated maxsize section and SPAWN_PROTECTION flag - Translate reserved-island, Placeholder Browser, authors label - Fix "球員" (sports player) to "玩家" (game player) throughout team GUI - Fix "播放器" (media player) to "玩家" in blueprint times - Fix "伊斯蘭國" (ISIS) machine translation error in purge too-many - Fix "彎曲曲托" to "BentoBox" in perms description - Fix "要騙子玩家" to "設為協作者" for coop command - Fix wrong Minecraft item names: 磨石->砂輪, 打擊->切石機, 簽名編輯->告示牌編輯 - Translate Shulker/Enderman teleport, Crafter, Smithing, Loom, Grindstone flags - Fix SONIC_BOOM DamageCause "聲音繁榮" to "音波衝擊" - Fix broken MiniMessage tags: &但->gray tag, mismatched bold/color nesting - Fix "b不支持的" typo in NOT_SUPPORTED compatibility message - Fix command-instructions machine translations (雞舍, Demote, Unban, etc.) - Fix various hint fields missing red formatting tags Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/zh-HK.yml | 236 +++++++++++++-------------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/src/main/resources/locales/zh-HK.yml b/src/main/resources/locales/zh-HK.yml index 6d4fdfdce..b1378681d 100644 --- a/src/main/resources/locales/zh-HK.yml +++ b/src/main/resources/locales/zh-HK.yml @@ -61,7 +61,7 @@ commands: maxhomes: description: 更改此[prefix_island]或玩家的[prefix_island]的房屋數量 parameters: [[prefix_island] name] - max-homes-set: '[name] - Set [prefix_island] max homes to [number]' + max-homes-set: '[name] - 已將[prefix_island]最大Home數設為 [number]' errors: unknown-island: 未知[prefix_island]! [name] resethome: @@ -93,9 +93,9 @@ commands: days-one-or-more: '天數必須為最少1。' purgable-islands: '找到 [number]個 不活動可以被清理的島嶼。' too-many: |- - 這很多,可能需要很長時間才能刪除。 - 考慮使用區域性插件來刪除世界塊 - 並設置保留的陸地上的伊斯蘭國:bentobox的config.yml中。 + 數量很多,可能需要很長時間才能刪除。 + 考慮使用區域性插件來刪除世界區塊 + 並在 BentoBox 的 config.yml 中設置保留島嶼。 然後進行清除。 purge-in-progress: |- 清理正在進行中。 @@ -114,7 +114,7 @@ commands: regions: parameters: '[days]' description: 通過刪除舊區域文件清除島 - confirm: '類型 /[label] purge regions confirm 要開始清除' + confirm: '輸入 /[label] purge regions confirm 開始清除' protect: description: 開/關 島嶼清理保護, 開啟清理保護的島嶼不會被清理。 move-to-island: '請先回到島上再進行操作!' @@ -159,7 +159,7 @@ commands: not-in-team: '這玩家不在隊伍中。' admin-kicked: '管理員將您從隊伍中踢了出來。' success: '您已將 [name] [owner] 的島嶼裡踢出去。' - success-all: '球員從這個世界上的所有球隊中撤出' + success-all: '玩家已從此世界中的所有隊伍中移除' setowner: parameters: description: 將島嶼所有權轉移給指定玩家 @@ -167,12 +167,12 @@ commands: must-be-on-island: '您必須在[prefix_island]上設置所有者' confirmation: 您確定要設置[name]在[xyz]上成為[prefix_island]的所有者嗎? success: '已將[name]提升為島主。' - extra-islands: 警告:該玩家現在擁有[number]島。這是設置或perms所允許的要多:[max]。 + extra-islands: 警告:該玩家現在擁有 [number] 個島嶼。這超過了設置或權限所允許的數量:[max]。 maxsize: parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + description: 設定玩家的[prefix_island]最大隊伍人數(使用 0 重置為世界預設值) + success: '已將 [name] 的[prefix_island]最大隊伍人數設為 [number]' + reset: '已將 [name] 的[prefix_island]最大隊伍人數重置為世界預設值([number])。' range: description: 島嶼範圍管理命令 invalid-value: @@ -209,7 +209,7 @@ commands: parameters: description: 將玩家註冊到您當前所在的無人島 registered-island: '已將玩家註冊到位於 [xyz] 的島嶼。' - reserved-island: 'Reserved island at [xyz] for [name].' + reserved-island: '已為 [name] 保留位於 [xyz] 的[prefix_island]。' already-owned: '該島嶼不是無人島!' no-island-here: '這個地方沒有島嶼。確認來創建一個。' in-deletion: '這個島嶼空間正在被刪除。 請稍後再試' @@ -304,7 +304,7 @@ commands: manual: '沒有安全傳送點!手動傳送至 [location] 附近並解決這個問題' tpuser: parameters: <[prefix_island]'s player> [player's island] - description: 傳送一個球員到另一個球員的[prefix_island] + description: 將一個玩家傳送到另一個玩家的[prefix_island] getrank: parameters: [island owner] description: 得到玩家在他們的島嶼上的階銜 @@ -455,9 +455,9 @@ commands: 左鍵點擊 - 增加(往後移) 右鍵點擊 - 減少(往前移) times: |- - 播放器的最大並髮用途 - 左鍵單擊以增加 - 右鍵單擊以減少 + 玩家最大使用次數 + 左鍵點擊增加 + 右鍵點擊減少 unlimited-times: 無限 maximum-times: 最大[number]次 cost: | @@ -528,12 +528,12 @@ commands: 成功將玩家 [name] 的死亡次數減少 [number] 次。 他現在的死亡次數為: [total] 次。" resetname: - description: 重置播放器[prefix_island]名稱 - success: 成功重置[name]的[prefix_island]名稱。 + description: 重置玩家的[prefix_island]名稱 + success: '成功重置 [name] 的[prefix_island]名稱。' bentobox: description: BentoBox 管理員命令 perms: - description: 以yaml格式顯示彎曲曲托和插件的有效perm + description: 以 YAML 格式顯示 BentoBox 和附加組件的有效權限 about: description: 顯示版權和協議信息 placeholders: @@ -708,28 +708,28 @@ commands: description: '點擊循環排名' invitation: 邀請 invite: - name: 邀請球員 + name: 邀請玩家 description: |- - 球員必須在 - 和你成為同一世界 - 顯示在列表中。 + 玩家必須在 + 和你相同的世界 + 才會顯示在列表中。 tips: LEFT: name: '左點擊' - invite: '邀請球員' + invite: '邀請玩家' RIGHT: name: '右鍵單擊' SHIFT_RIGHT: - name: '右鍵單擊' + name: 'Shift+右鍵點擊' reject: '拒絕' - kick: '踢球員' - leave: '離開團隊' + kick: '踢出玩家' + leave: '離開隊伍' SHIFT_LEFT: - name: '左右單擊' + name: 'Shift+左鍵點擊' accept: '接受' setowner: |- - 設置所有者 - 給這個球員 + 將此玩家 + 設為島主 info: description: 顯示關於您的隊伍的詳細信息 member-layout: @@ -794,7 +794,7 @@ commands: you-will-lose-your-island: '警告!如果您同意, 您將失去自己的島嶼!' gui: titles: - team-invite-panel: 邀請球員 + team-invite-panel: 邀請玩家 button: already-invited: '已經邀請了' search: '搜索玩家' @@ -808,14 +808,14 @@ commands: search: '輸入玩家的名字' back: '後退' invite: |- - 邀請球員 - 加入您的團隊 + 邀請玩家 + 加入您的隊伍 RIGHT: name: '右鍵單擊' - coop: '要騙子玩家' + coop: '設為協作者' SHIFT_LEFT: - name: '左右單擊' - trust: '信任球員' + name: 'Shift+左鍵點擊' + trust: '信任玩家' errors: cannot-invite-self: '您不能邀請您自己!' cooldown: '您必須在 [number] 秒後才能邀請這個人' @@ -964,9 +964,9 @@ protection: name: '使用信標' hint: '已被禁止使用信標' BELL_RINGING: - description: 切換交互 - name: 讓鈴響 - hint: 貝爾鈴聲被禁用 + description: 切換鐘交互 + name: 敲鐘 + hint: '已被禁止敲鐘' BED: description: 切換 床交互/使用權 name: '使用床' @@ -1012,17 +1012,17 @@ protection: name: '使用按鈕' hint: '已被禁止使用按鈕' CANDLES: - description: 切換蠟燭相互作用 + description: 切換蠟燭交互 name: 蠟燭 - hint: 蠟燭互動禁用 + hint: '已被禁止與蠟燭交互' CAKE: description: 允許/禁止 食用蛋糕 name: '食用蛋糕' hint: '已被禁止食用蛋糕' CARTOGRAPHY: - name: 製圖表 - description: 切換使用 - hint: 製圖表訪問禁用 + name: 製圖台 + description: 切換製圖台使用權 + hint: '已被禁止使用製圖台' CONTAINER: name: '使用容器' description: |- @@ -1044,48 +1044,48 @@ protection: description: 允許/禁止 使用桶 hint: '已被禁止使用桶' CRAFTER: - name: 手工藝者 - description: 切換使用 - hint: Crafter訪問禁用 + name: 合成器 + description: 切換合成器使用權 + hint: '已被禁止使用合成器' BLOCK_EXPLODE_DAMAGE: description: |- 允許床和重生錨 - 打破塊和損壞 + 破壞方塊和傷害 實體。 - name: 阻止爆炸傷害 + name: 方塊爆炸傷害 COMPOSTER: name: '使用堆肥桶' description: 允許/禁止 使用堆肥桶 hint: '已被禁止使用堆肥桶' LOOM: - name: 織機 - description: 切換使用 - hint: 織機訪問禁用 + name: 織布機 + description: 切換織布機使用權 + hint: '已被禁止使用織布機' FLOWER_POT: name: '使用花盆' description: 允許/禁止 使用花盆 hint: '已被禁止使用花盆' GRINDSTONE: - name: 磨石 - description: 切換使用 - hint: 磨石訪問禁用 + name: 砂輪 + description: 切換砂輪使用權 + hint: '已被禁止使用砂輪' SHULKER_BOX: name: '使用界伏盒' description: 允許/禁止 使用界伏盒 hint: '已被禁止使用界伏盒' SHULKER_TELEPORT: description: |- - Shulker可以傳送 - 如果活動。 - name: Shulker teleport + 啟用後,界伏蚌 + 可以傳送。 + name: 界伏蚌傳送 SMITHING: - name: 鍛造 - description: 切換使用 - hint: 鍛造訪問禁用 + name: 鍛造台 + description: 切換鍛造台使用權 + hint: '已被禁止使用鍛造台' STONECUTTING: - name: 打擊 - description: 切換使用 - hint: 打擊訪問禁用 + name: 切石機 + description: 切換切石機使用權 + hint: '已被禁止使用切石機' TRAPPED_CHEST: name: '使用陷阱箱' description: 允許/禁止 使用陷阱箱 @@ -1160,9 +1160,9 @@ protection: name: '苦力怕訪客保護' hint: '已禁止訪客引燃的苦力怕爆炸' CROP_PLANTING: - description: '設定誰可以種子。' + description: '設定誰可以種植作物。' name: 作物種植 - hint: 作物種植障礙 + hint: '已被禁止種植作物' CROP_TRAMPLE: description: 允許/禁止 踩壞農作物 name: '踐踏農作物' @@ -1201,9 +1201,9 @@ protection: name: '終界使者破壞' ENDERMAN_TELEPORT: description: |- - Endermen可以傳送 - 如果活動。 - name: Enderman Teleport + 啟用後,終界使者 + 可以傳送。 + name: 終界使者傳送 ENDER_PEARL: description: |- 允許/禁止 使用終界珍珠 @@ -1265,18 +1265,18 @@ protection: HARVEST: description: |- 設定誰可以收穫農作物。 - 不要忘記允許物品 - 也接! + 別忘了也允許 + 拾取物品! name: 收穫作物 - hint: 收穫作物殘疾 + hint: '已被禁止收穫作物' HIVE: description: 允許/禁止 收集蜂蜜 name: '收集蜂蜜' hint: '已被禁止收集蜂蜜' HURT_TAMED_ANIMALS: - description: 切換傷害。啟用意味著馴服的動物會受到傷害。殘疾意味著它們是無敵的。 + description: 切換傷害。啟用時馴服的動物會受到傷害。禁用時它們將無敵。 name: 傷害馴服的動物 - hint: 馴服的動物受傷的殘疾 + hint: '已被禁止傷害馴服的動物' HURT_ANIMALS: description: 允許/禁止 傷害動物 name: '傷害動物' @@ -1325,7 +1325,7 @@ protection: LEASH: description: 允許/禁止 使用栓繩 name: '使用栓繩' - hint: 皮帶使用禁用 + hint: '已被禁止使用栓繩' LECTERN: name: '講台上的書' description: |- @@ -1363,7 +1363,7 @@ protection: description: |- 允許/禁止 放置、摧毀和 進入礦車" - hint: Minecart互動禁用 + hint: '已被禁止與礦車交互' MONSTER_NATURAL_SPAWN: description: 允許/禁止 怪物自然生成 name: '怪物自然生成' @@ -1448,7 +1448,7 @@ protection: 切換使用金蒲公英 暫停或恢復幼年 生物的成長 - hint: 暫停生物成長已禁用 + hint: '暫停生物成長已禁用' PRESSURE_PLATE: description: 允許/禁止 激活壓力板 name: '使用壓力板' @@ -1515,9 +1515,9 @@ protection: name: '使用伏聆嘯口' hint: '已被禁止使用伏聆嘯口' SIGN_EDITING: - description: '允許文本編輯標誌' - name: 簽名編輯 - hint: 簽名編輯被禁用 + description: '允許編輯告示牌文字' + name: 告示牌編輯 + hint: '已被禁止編輯告示牌' TNT_DAMAGE: description: 允許/禁止 TNT和TNT礦車破壞方塊和實體 name: 'TNT傷害' @@ -1562,18 +1562,18 @@ protection: 允許即為阻止傳送 hint: '已禁止在下墜時進行傳送' VISITOR_KEEP_INVENTORY: - name: 游客對死亡進行盤點 + name: 訪客死亡保留物品 description: |- - 防止玩家失去他們的物品和 - 經驗,只適用於他們死在了 - 他們是游客的島嶼。 + 防止玩家在作為訪客的島嶼 + 上死亡時失去物品和經驗。 + 僅適用於訪客身份。 SPAWN_PROTECTION: - name: Spawn island void protection + name: 出生島虛空保護 description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + 啟用後,在出生島 + 掉入虛空的玩家 + 會被傳送回出生點 + 而不是死亡。 RAID_TRIGGER: name: 觸發突襲 description: 設置觸發突襲所需的島嶼最低等級 @@ -1589,7 +1589,7 @@ protection: 切換風彈的使用。 如果禁用,訪客將無法 在該島嶼上使用風彈。 - hint: 風彈使用已禁用 + hint: '已被禁止使用風彈' WITHER_DAMAGE: name: '凋零傷害' description: |- @@ -1598,8 +1598,8 @@ protection: WORLD_BLOCK_EXPLODE_DAMAGE: description: |- 允許床和重生錨 - 打破塊和損壞 - 島嶼限制之外的實體。 + 破壞方塊和傷害 + 島嶼範圍外的實體。 name: 世界方塊爆炸傷害 WORLD_TNT_DAMAGE: description: |- @@ -1637,31 +1637,31 @@ protection: title: '設置' description: '適用於該島嶼的一般設置項' WORLD_SETTING: - title: '用於 [world_name] 的一般設置' + title: '用於 [world_name] 的一般設置' description: '這些設置項適用於全部游戲世界' WORLD_DEFAULTS: - title: '用於 [world_name] 的保護設定' + title: '用於 [world_name] 的保護設定' description: '島嶼範圍外適用的保護設定' flag-item: name-layout: '[name]' command-instructions: - setname: '選擇可以設置名稱' - ban: '選擇可以禁令球員' - unban: '選擇可以 Unban球員' + setname: '選擇誰可以設置名稱' + ban: '選擇誰可以封禁玩家' + unban: '選擇誰可以解封玩家' expel: '選擇誰可以驅逐訪客' - team-invite: '選擇可以邀請' - team-kick: '選擇可以踢' - team-coop: '選擇可以雞舍' - team-trust: '選擇可以相信' - team-uncoop: '選擇可以uncoop' - team-untrust: '選擇可以不信任' - team-promote: '選擇可以促進球員的等級' - team-demote: '選擇可以Demote球員的排名' - sethome: '選擇可以設置房屋' - deletehome: '選擇可以刪除房屋' - renamehome: '選擇可以重命名房屋' - setcount: '選擇可以更改階段' - border: '選擇可以使用邊境命令' + team-invite: '選擇誰可以邀請' + team-kick: '選擇誰可以踢出' + team-coop: '選擇誰可以設為協作者' + team-trust: '選擇誰可以設為信任者' + team-uncoop: '選擇誰可以取消協作' + team-untrust: '選擇誰可以取消信任' + team-promote: '選擇誰可以升階玩家' + team-demote: '選擇誰可以降階玩家' + sethome: '選擇誰可以設置Home點' + deletehome: '選擇誰可以刪除Home點' + renamehome: '選擇誰可以重命名Home點' + setcount: '選擇誰可以更改等級' + border: '選擇誰可以使用邊界命令' description-layout: |- [description] @@ -1744,15 +1744,15 @@ management: 正在運行 [name] [version] BentoBox當前正運行在 - b不支持的的服務器軟件和版本上。 + 不支持的的服務器軟件和版本上。 雖然它的部分功能可以正常運行, - &但可能發生平台相關的錯誤。 + 但可能發生平台相關的錯誤。 INCOMPATIBLE: | 正在運行 [name] [version] BentoBox當前正運行在 - 不兼容 的服務器軟件和版本上。 + 不兼容的服務器軟件和版本上。 它並不是為此運行環境設計的,可能 會發生奇怪的行為和錯誤,並且大部 @@ -1785,7 +1785,7 @@ catalog: description: | BentoBox 無法連接到 GitHub。 - 請修改配置允許BentoBox連接 + 請修改配置允許BentoBox連接 到互聯網, 或稍後再試。 enums: DamageCause: @@ -1818,8 +1818,8 @@ enums: CRAMMING: 擁擠 DRYOUT: 乾燥(魚類暴露在空氣中) FREEZE: 凍結 - KILL: 殺 - SONIC_BOOM: 聲音繁榮 + KILL: /kill 命令 + SONIC_BOOM: 音波衝擊 WORLD_BORDER: 世界邊界 panel: credits: @@ -1832,7 +1832,7 @@ panel: description: |- BentoBox 無法收集此組件的貢獻者。 - 請修改配置允許BentoBox連接 + 請修改配置允許BentoBox連接 到互聯網, 或稍後再試。 panels: island_homes: @@ -1857,11 +1857,11 @@ panels: description: |- [authors] |[selected] - authors: 'Authors: ' + authors: '作者: ' author: '- [name]' selected: '當前選擇。' placeholder: - title: 'Placeholder Browser' + title: '佔位符瀏覽器' buttons: bentobox: name: 'BentoBox' From 1f26c5521b48deea957528000b16f1ea66ac3a9b Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 4 Apr 2026 21:22:50 -0700 Subject: [PATCH 48/95] Fix Dutch (nl.yml) locale: correct mistranslations, placeholders, and untranslated strings - Translate untranslated English sections (maxsize, SPAWN_PROTECTION) - Fix translated placeholders back to English ([omschrijving]->[description], [bericht]->[message], [locatie]->[location], [onderwerp]->[topic], [installeren]->[install], [volgende]->[next], [wereld]->[world], [beschrijving]->[description], [prefix_eiland]->[prefix_island]) - Fix broken [name] placeholders (missing opening bracket in name-layout, credits) - Fix broken legacy color codes: & b -> proper MiniMessage tags - Fix "Nederland" (The Netherlands) -> "de Nether" in 4 places - Fix VOID "Ongeldig" (Invalid) -> "De Leegte" (The Void) - Fix wrong translations: "kippenhok" (chicken coop) -> "coop-lid", "Borstschade" (breast damage) -> "Kistschade" (chest damage), "Koor fruit" -> "Chorusfruit", "Kladblok" (notepad) -> "Nootblok", "Paaien eieren" (fish spawning) -> "Spawn-eieren", "Troosten" (to comfort) -> "Console", "klimplant" (vine) -> "creeper", "schoft" (scoundrel) -> "wither", "Betrijp" -> "Verwond", "Blokkeer explosie" -> "Blokexplosie", "Verbindingen" -> "Bijdragen" - Fix typos: "Teamaanmanagement" -> "Teambeheer", "verwijen" -> correct text - Fix misleading translations: unban messages, banlist, rank name - Remove errant ": c" from none-invited-you message - Fix untranslated English words: "Found", "Island at", "Island is", "Player" Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/resources/locales/nl.yml | 179 +++++++++++++++--------------- 1 file changed, 89 insertions(+), 90 deletions(-) diff --git a/src/main/resources/locales/nl.yml b/src/main/resources/locales/nl.yml index e37ed4ed8..555db92a2 100644 --- a/src/main/resources/locales/nl.yml +++ b/src/main/resources/locales/nl.yml @@ -57,7 +57,7 @@ commands: page: 'Pagina [page] van [total]' parameters: '[command]' description: help commando - console: Troosten + console: Console admin: help: description: admin commando @@ -65,13 +65,13 @@ commands: description: >- wijzig het aantal toegestane huizen op deze [prefix_island] of het huis van de speler [prefix_island] - parameters: [[prefix_eiland] naam] + parameters: [[prefix_island] naam] max-homes-set: '[name] - Zet [prefix_island] maximaal aantal huizen op [number]' errors: unknown-island: Onbekend [prefix_island]! [name] resethome: description: Reset het thuis van de speler naar standaard - parameters: [[prefix_eiland] naam] + parameters: [[prefix_island] naam] cleared: 'Thuis reset. [name]' resets: description: bewerk resets van de spelers @@ -88,8 +88,8 @@ commands: description: telt op bij het aantal keren dat deze speler zijn eiland reset parameters: success: >- - Met succes toegevoegd [number] wordt gereset naar & b [name], - waardoor het totaal wordt verhoogd naar [total] wordt gereset. + Met succes [number] resets toegevoegd aan [name], + waardoor het totaal wordt verhoogd naar [total] resets. remove: description: verwijdert uit hoe vaak deze speler zijn eiland reset parameters: @@ -141,12 +141,11 @@ commands: stopping: De zuivering stoppen unowned: description: zuiveren van eilanden die geen eigendom zijn - unowned-islands: 'Found [number]eilanden zonder eigendom.' + unowned-islands: 'Gevonden [number] eilanden zonder eigendom.' status: description: geeft de status van de zuivering weer status: >- - [purged] eilanden gezuiverd uit [purgeable] (& b - [percentage]% ) . + [purged] eilanden gezuiverd uit [purgeable] ([percentage]%) . team: description: team beheren add: @@ -195,10 +194,10 @@ commands: Waarschuwing: deze speler bezit nu [number] eilanden. Dit is meer dan toegestaan volgens de instellingen of permissies: [max]. maxsize: - parameters: - description: Set the max team size for a player's [prefix_island] (use 0 to reset to world default) - success: 'Set [name]''s [prefix_island] max team size to [number].' - reset: 'Reset [name]''s [prefix_island] max team size to the world default ([number]).' + parameters: + description: stel de maximale teamgrootte in voor het [prefix_island] van een speler (gebruik 0 om naar de standaard te resetten) + success: 'De maximale teamgrootte van [name]''s [prefix_island] ingesteld op [number].' + reset: 'De maximale teamgrootte van [name]''s [prefix_island] gereset naar de standaard ([number]).' range: description: admin eilandbereik commando invalid-value: @@ -246,7 +245,7 @@ commands: description: registreer speler op het eiland waar je je bevindt registered-island: 'geregistreerde [name] op het eiland op [xyz].' reserved-island: 'gereserveerd eiland op [xyz] voor [name].' - already-owned: 'Island is al eigendom van een andere speler!' + already-owned: 'Eiland is al eigendom van een andere speler!' no-island-here: 'Er is hier geen eiland. Bevestig om er een te maken.' in-deletion: 'Deze eilandruimte wordt momenteel verwijderd. Probeer later.' cannot-make-island: >- @@ -286,7 +285,7 @@ commands: island-protection-center: 'Beschermingsgebied centrum: [xyz]' island-center: 'Eilandcentrum: [xyz]' island-coords: 'Eilandcoördinaten: [xz1] tot [xz2]' - islands-in-trash: 'Player heeft eilanden in de prullenbak.' + islands-in-trash: 'Speler heeft eilanden in de prullenbak.' protection-range: 'Beschermingsbereik: [range]' protection-range-bonus-title: 'Inclusief deze bonussen:' protection-range-bonus: 'Bonus: [number]' @@ -354,7 +353,7 @@ commands: parameters: [speler om te teleporteren] description: teleporteer naar het eiland van een speler manual: >- - Geen veilige warp gevonden! Handmatig tp in de buurt van [locatie] + Geen veilige warp gevonden! Handmatig tp in de buurt van [location] en bekijk het tpuser: parameters: <[prefix_island]'s player> [player's island] @@ -420,7 +419,7 @@ commands: file-exists: 'Bestand bestaat al, overschrijven?' no-such-file: 'Zo''n bestand bestaat niet!' could-not-load: 'Kon dat bestand niet laden!' - could-not-save: 'Hmm, er is iets misgegaan bij het opslaan van dat bestand: [bericht]' + could-not-save: 'Hmm, er is iets misgegaan bij het opslaan van dat bestand: [message]' set-pos1: 'positie 1 ingesteld op [vector]' set-pos2: 'positie 2 ingesteld op [vector]' set-different-pos: 'Stel een andere locatie in - deze positie is al ingesteld!' @@ -571,7 +570,7 @@ commands: cannot-delete-owner: >- Alle eilandleden moeten van het eiland worden verwijderd voordat ze het kunnen verwijderen. - deleted-island: 'Island at [xyz] is succesvol verwijderd.' + deleted-island: 'Eiland op [xyz] is succesvol verwijderd.' deletehomes: parameters: description: verwijdert alle benoemde huizen van [prefix_an-island] @@ -722,7 +721,7 @@ commands: estimated-time: 'Geschatte tijd: [number]seconden.' blocks: 'Building it blok voor blok: [number] blokken in totaal ...' entities: 'Het vullen met entiteiten: [number]entiteiten in totaal ...' - dimension-done: '[prefix_Island] in [wereld] is gebouwd.' + dimension-done: '[prefix_Island] in [world] is gebouwd.' done: 'Klaar! Je eiland staat klaar en wacht op je!' pick: 'Kies een eiland' cannot-afford: 'Je kunt dit niet betalen! Kosten: [cost]' @@ -774,7 +773,7 @@ commands: home-list-syntax: '[name]' click-to-teleport: 'Klik om te teleporteren!' nether: - not-allowed: 'Het is niet toegestaan om uw huis in Nederland te plaatsen.' + not-allowed: 'Het is niet toegestaan om uw huis in de Nether te plaatsen.' confirmation: 'Weet u zeker dat u uw huis in de Nether wilt plaatsen?' the-end: not-allowed: 'Je mag je huis niet op het einde zetten.' @@ -799,7 +798,7 @@ commands: description: beheer je team gui: titles: - team-panel: Teamaanmanagement + team-panel: Teambeheer buttons: status: name: Status @@ -869,7 +868,7 @@ commands: all-members-logged-off: >- Alle leden van het eiland hebben zich afgemeld, zodat u niet langer een coöperatief lid bent van het eiland van [name]. - success: '[name] is niet langer lid van de kippenhok van uw eiland.' + success: '[name] is niet langer coop-lid van uw eiland.' is-full: 'Je kunt niemand anders opsluiten.' trust: description: geef een speler een vertrouwde rang op je eiland @@ -878,7 +877,7 @@ commands: name-has-invited-you: >- [name] heeft je uitgenodigd om lid te worden van een vertrouwd lid van hun eiland. - player-already-trusted: 'Player is al vertrouwd!' + player-already-trusted: 'Speler is al vertrouwd!' you-are-trusted: 'U wordt vertrouwd door [name] !' success: 'U vertrouwde [name] .' is-full: 'Je kunt niemand anders vertrouwen.' @@ -916,7 +915,7 @@ commands: back: 'Terug' invite: |- om een speler uit te nodigen - om je team te verwijen + om lid te worden van je team RIGHT: name: 'Rechts Klikken' coop: 'om speler te coöpereren' @@ -929,7 +928,7 @@ commands: Je kunt die persoon niet voor nog een [number]seconden uitnodigen. island-is-full: 'Je eiland is vol, je kunt niemand anders uitnodigen.' - none-invited-you: 'Niemand heeft je uitgenodigd: c.' + none-invited-you: 'Niemand heeft je uitgenodigd.' you-already-are-in-team: 'Je zit al in een team!' already-on-team: 'Die speler zit al in een team!' invalid-invite: 'Die uitnodiging is niet langer geldig, sorry.' @@ -1015,11 +1014,11 @@ commands: parameters: cannot-unban-yourself: 'Je kunt jezelf niet ongedaan maken!' player-not-banned: 'Speler is niet verbannen.' - player-unbanned: '[name] is nu uitgesloten van uw eiland.' - you-are-unbanned: '[name] verbannen u van hun eiland!' + player-unbanned: '[name] is nu niet meer verbannen van uw eiland.' + you-are-unbanned: '[name] heeft uw verbanning van hun eiland opgeheven!' banlist: description: lijst verbannen spelers - noone: 'Niemand is verboden op dit eiland.' + noone: 'Niemand is verbannen van dit eiland.' the-following: 'De volgende spelers zijn uitgesloten:' names: '[line]' you-can-ban: 'Je kunt tot [number]meer spelers bannen.' @@ -1051,7 +1050,7 @@ ranks: trusted: Vertrouwd coop: Coop visitor: Bezoeker - banned: Verboden + banned: Verbannen admin: Beheerder mod: Mod protection: @@ -1073,7 +1072,7 @@ protection: hint: Gebruik van aambeeld uitgeschakeld ARMOR_STAND: description: Wissel interactie - name: Armor staat + name: Wapenstandaards hint: Gebruik van pantserstandaard uitgeschakeld AXOLOTL_SCOOPING: name: Axolotl Scheppen @@ -1169,9 +1168,9 @@ protection: description: Schakel vateninteractie in/uit hint: Toegang tot vat uitgeschakeld CRAFTER: - name: Knutsel - description: Gebruik - hint: Knutsel uitgeschakeld + name: Crafter + description: Schakel gebruik in/uit + hint: Crafter uitgeschakeld BLOCK_EXPLODE_DAMAGE: description: |- Sta Bed & Respawn Ankers toe @@ -1232,12 +1231,12 @@ protection: description: Schakel tussen trechterinteractie hint: Vultrechterinteractie uitgeschakeld CHEST_DAMAGE: - description: Schakel borstschade door explosies om - name: Borstschade + description: Schakel kistschade door explosies om + name: Kistschade CHORUS_FRUIT: description: Schakel teleportatie in - name: Koor fruit - hint: Koorfruit teleporteren uitgeschakeld + name: Chorusfruit + hint: Chorusfruit teleporteren uitgeschakeld CLEAN_SUPER_FLAT: description: |- Schakel in om alles op te schonen @@ -1278,16 +1277,16 @@ protection: hint: Toegang tot werkbank uitgeschakeld CREEPER_DAMAGE: description: | - Toggle klimplant - bescherming tegen schade - name: Bescherming tegen schade door kruipers + Schakel creeper- + schadebescherming in/uit + name: Creeper-schadebescherming CREEPER_GRIEFING: description: | - Toggle klimplant verdriet - bescherming bij ontsteking + Schakel creeper-griefing- + bescherming in/uit bij ontsteking door eilandbezoeker. - name: Creeper rouwende bescherming - hint: Creeper verdriet uitgeschakeld + name: Creeper-griefingbescherming + hint: Creeper-griefing uitgeschakeld CROP_PLANTING: description: 'Stel in wie zaden kan planten.' name: Gewasplanting @@ -1301,7 +1300,7 @@ protection: name: Gebruik deuren hint: Deurinteractie uitgeschakeld DRAGON_EGG: - name: Draken Ei + name: Drakenei description: |- Voorkomt interactie met drakeneieren. @@ -1326,15 +1325,15 @@ protection: hint: Ender-kisten zijn uitgeschakeld in deze wereld ENDERMAN_DEATH_DROP: description: |- - Enderman zal vallen - willekeurig blok dat ze zijn - bedrijf als het wordt gedood. - name: Enderman Dooddruppel + Enderman laat het blok vallen + dat ze vasthouden + als ze worden gedood. + name: Enderman doodsdrop ENDERMAN_GRIEFING: description: |- Enderman kan verwijderen blokken van eilanden - name: Enderman verdrietig + name: Enderman-griefing ENDERMAN_TELEPORT: description: |- Eindermanen kunnen teleporteren @@ -1355,9 +1354,9 @@ protection: EXPERIENCE_BOTTLE_THROWING: name: Ervaar het gooien van flessen description: Wissel met het werpen van ervaringsflessen. - hint: Ervaar flessen met een handicap + hint: Ervaringsflessen gooien uitgeschakeld FIRE_BURNING: - name: Brandend vuur + name: Vuurverbranding description: |- Omschakelen of vuur kan branden blokken of niet. @@ -1415,7 +1414,7 @@ protection: description: >- Schakel schade aan. Ingeschakeld betekent dat tamme dieren schade kunnen oplopen. Uitgeschakeld betekent dat ze onoverwinnelijk zijn. - name: Betrijp tamme dieren + name: Verwond tamme dieren hint: Getemde dieren schade uitschakelen HURT_ANIMALS: description: Schakel pijn uit @@ -1428,9 +1427,9 @@ protection: HURT_VILLAGERS: description: Schakel pijn uit name: Dorpsbewoners pijn doen - hint: Dorpeling met een handicap + hint: Dorpelingen verwonden uitgeschakeld ITEM_FRAME: - name: Voorwerp kader + name: Itemframes description: |- Toggle-interactie. Overrides plaatsen of breken blokken @@ -1439,7 +1438,7 @@ protection: description: |- Mobs kunnen schade toebrengen itemframes - name: Schade aan het frame van het item + name: Itemframe-schade INVINCIBLE_VISITORS: description: |- onoverwinnelijke bezoeker configureren @@ -1457,8 +1456,8 @@ protection: hint: Het verwijderen van items is uitgeschakeld ITEM_PICKUP: description: Schakel ophalen - name: Afhalen van artikelen - hint: Ophalen van artikel is uitgeschakeld + name: Items oppakken + hint: Items oppakken is uitgeschakeld JUKEBOX: description: Schakel tussen gebruik name: Jukebox-gebruik @@ -1532,14 +1531,14 @@ protection: description: |- Toggle-toegang om inventaris op te zetten - name: Monteer inventaris - hint: Het opbouwen van voorraden is uitgeschakeld + name: Rij-inventaris + hint: Toegang tot rij-inventaris is uitgeschakeld NAME_TAG: name: Naamplaatjes description: Toggle gebruik hint: Interactie met naamlabel uitgeschakeld NATURAL_SPAWNING_OUTSIDE_RANGE: - name: Natuurlijk wezen paait buiten bereik + name: Natuurlijke spawning buiten bereik description: |- Omschakelen of wezens (dieren en monsters) kunnen van nature buiten spawnen @@ -1550,8 +1549,8 @@ protection: ei. NOTE_BLOCK: description: Toggle gebruik - name: Kladblok - hint: Noteblock-interactie uitgeschakeld + name: Nootblok + hint: Nootblok-interactie uitgeschakeld OBSIDIAN_SCOOPING: name: Obsidiaan scheppen description: |- @@ -1647,9 +1646,9 @@ protection: PVP in- / uitschakelen in de Nether. name: Nether PVP - hint: PVP uitgeschakeld in Nederland - enabled: 'De PVP in Nederland is ingeschakeld.' - disabled: 'De PVP in Nederland is uitgeschakeld.' + hint: PVP uitgeschakeld in de Nether + enabled: 'De PVP in de Nether is ingeschakeld.' + disabled: 'De PVP in de Nether is uitgeschakeld.' PVP_OVERWORLD: description: |- PVP in- / uitschakelen @@ -1660,7 +1659,7 @@ protection: disabled: 'De PVP in the Overworld is uitgeschakeld.' REDSTONE: description: Toggle gebruik - name: Redstone-artikelen + name: Redstone-items hint: Redstone-interactie uitgeschakeld REMOVE_END_EXIT_ISLAND: description: |- @@ -1683,13 +1682,13 @@ protection: hint: Scheren is uitgeschakeld SPAWN_EGGS: description: Toggle gebruik - name: Paaien eieren - hint: Broedeieren uitgeschakeld + name: Spawn-eieren + hint: Spawn-eieren uitgeschakeld SPAWNER_SPAWN_EGGS: description: |- Maakt het mogelijk om het entiteitstype van een spawner te wijzigen het gebruik van spawn-eieren. - name: Paaien eieren op spawners + name: Spawn-eieren op spawners hint: >- het wijzigen van het entiteitstype van een spawner met spawn-eieren is niet toegestaan @@ -1769,12 +1768,12 @@ protection: [prefix_Island] leden verliezen nog steeds hun items als ze sterven op hun eigen [prefix_island]! SPAWN_PROTECTION: - name: Spawn island void protection + name: Spawn-eiland leegtebescherming description: |- - When enabled, players who fall - into the void at the spawn island - will be teleported back to the - spawn point instead of dying. + Wanneer ingeschakeld, worden spelers die + in de leegte vallen bij het spawn-eiland + teruggeteleporteerd naar het spawnpunt + in plaats van te sterven. RAID_TRIGGER: name: Aanval activeren description: Stelt de minimale eilandrang in die nodig is om een aanval te activeren @@ -1793,10 +1792,10 @@ protection: geen windladingen gebruiken op dit eiland. hint: Gebruik van windladingen uitgeschakeld WITHER_DAMAGE: - name: Schakel schoftschade in + name: Wither-schade description: |- - Indien actief, kan de schoft - schadeblokken en spelers + Indien actief, kan de wither + blokken en spelers beschadigen WORLD_BLOCK_EXPLODE_DAMAGE: description: |- Sta Bed & Respawn Ankers toe @@ -1811,9 +1810,9 @@ protection: name: Wereld TNT-schade locked: 'Dit eiland is op slot!' locked-island-bypass: 'Dit [prefix_island] is op slot, maar je hebt toestemming om dit te negeren.' - protected: 'Eiland beschermd: [omschrijving].' - world-protected: 'Wereld beschermd: [omschrijving].' - spawn-protected: 'Spawn beschermd: [omschrijving].' + protected: 'Eiland beschermd: [description].' + world-protected: 'Wereld beschermd: [description].' + spawn-protected: 'Spawn beschermd: [description].' panel: next: 'Volgende pagina' previous: 'Vorige pagina' @@ -1827,7 +1826,7 @@ protection: expert: name: 'Expertinstellingen' description: 'Geeft alle beschikbare instellingen weer.' - click-to-switch: 'Klik op om over te schakelen naar de [volgende] .' + click-to-switch: 'Klik op om over te schakelen naar de [next] .' reset-to-default: name: 'Reset naar standaard' description: | @@ -1854,7 +1853,7 @@ protection: Beveiligingsinstellingen wanneer speler is buiten zijn eiland flag-item: - name-layout: 'naam]' + name-layout: '[name]' command-instructions: setname: |- Selecteer de rang die de @@ -2024,8 +2023,8 @@ catalog: beschikbare officiële add-ons. icon: description-template: | - [onderwerp] - [installeren] + [topic] + [install] [description] @@ -2053,9 +2052,9 @@ enums: MELTING: Smeltend LAVA: Lava DROWNING: Verdrinking - BLOCK_EXPLOSION: Blokkeer explosie + BLOCK_EXPLOSION: Blokexplosie ENTITY_EXPLOSION: Entiteitsexplosie - VOID: Ongeldig + VOID: De Leegte LIGHTNING: Bliksem SUICIDE: Zelfmoord STARVATION: Verhongering @@ -2065,7 +2064,7 @@ enums: FALLING_BLOCK: Vallend blok THORNS: Doornen DRAGON_BREATH: Draken adem - CUSTOM: Op maat + CUSTOM: Aangepast FLY_INTO_WALL: Vlieg in de muur HOT_FLOOR: Hete vloer CRAMMING: Proppen @@ -2078,8 +2077,8 @@ panel: credits: title: '[name] credits' contributor: - name: 'naam]' - description: 'Verbindingen: [commits]' + name: '[name]' + description: 'Bijdragen: [commits]' empty-here: name: 'Dit ziet er hier leeg uit ...' description: | @@ -2098,7 +2097,7 @@ panels: buttons: bundle: name: '[name]' - description: '[beschrijving]' + description: '[description]' uses: 'Gebruikt [number]/[max]' unlimited: 'Onbeperkt aantal gebruiken toegestaan' cost: 'Kosten: [cost]' From 96ef040dce721b7e32753691ab33977b43b9d31e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 04:41:51 +0000 Subject: [PATCH 49/95] Initial plan From e16a901162360181605f2c5da030c515eb86c6b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 04:51:44 +0000 Subject: [PATCH 50/95] Fix bold text continuing past closing tag in prefix translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When prefixes with bold/italic decorations (e.g. [BentoBox]: ) are converted to legacy § codes, the result has no reset code at the end. When substituted into message strings, the bold formatting leaks into subsequent text. Fix: Append §r reset after prefix translations in replacePrefixes() to prevent formatting leakage into surrounding message text. Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/624d7e6b-da75-4336-aae6-8b078f0d5ec6 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../bentobox/bentobox/api/user/User.java | 6 ++++ .../bentobox/bentobox/api/user/UserTest.java | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/api/user/User.java b/src/main/java/world/bentobox/bentobox/api/user/User.java index 32fccb37d..55b3ca47b 100644 --- a/src/main/java/world/bentobox/bentobox/api/user/User.java +++ b/src/main/java/world/bentobox/bentobox/api/user/User.java @@ -574,6 +574,12 @@ private String replacePrefixes(String translation, String[] variables) { for (String prefix : plugin.getLocalesManager().getAvailablePrefixes(this)) { String prefixTranslation = getTranslation("prefixes." + prefix); + // Append a formatting reset so prefix decorations (bold, italic, etc.) + // don't leak into the surrounding message text. + if (Util.isLegacyFormat(prefixTranslation)) { + prefixTranslation += "\u00A7r"; + } + // Replace the prefix in the actual message translation = translation.replace("[prefix_" + prefix + "]", prefixTranslation); } diff --git a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java index 73ba7b869..826f41812 100644 --- a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java +++ b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java @@ -929,4 +929,33 @@ void testSetMetaData() { assertEquals(Optional.of(metaData), p.getMetaData()); } + /** + * Verifies that bold formatting in a prefix does not leak into the + * surrounding message text after substitution. + * @see Bold text continues + */ + @Test + void testPrefixBoldDoesNotLeak() { + // Prefix with bold that should be contained + String prefix = "[BentoBox]: "; + String message = "[prefix_bentobox]Welcome to the island!"; + + // Return prefix for "prefixes.bentobox" key, message for the reference + when(testLm.get(any(), eq("prefixes.bentobox"))).thenReturn(prefix); + when(testLm.get(any(), eq("a.reference"))).thenReturn(message); + when(testLm.getAvailablePrefixes(any())).thenReturn(Set.of("bentobox")); + + String result = user.getTranslation("a.reference"); + + // The result is a legacy §-coded string. + // Bold (§l) must NOT appear before "Welcome" — the reset (§r) should separate them. + int welcomeIdx = result.indexOf("Welcome"); + assertTrue(welcomeIdx > 0, "Expected 'Welcome' in result: " + result); + + // Check that there's a reset (§r) between the prefix and "Welcome" + String beforeWelcome = result.substring(0, welcomeIdx); + assertTrue(beforeWelcome.contains("\u00A7r"), + "Expected §r reset before 'Welcome' to stop bold leakage: " + result); + } + } From e811747e0ae4b525d40c07be8382119ff7bbe742 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 04:54:23 +0000 Subject: [PATCH 51/95] Remove placeholder issue number from test Javadoc Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/624d7e6b-da75-4336-aae6-8b078f0d5ec6 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- src/test/java/world/bentobox/bentobox/api/user/UserTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java index 826f41812..baa326fc3 100644 --- a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java +++ b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java @@ -932,7 +932,6 @@ void testSetMetaData() { /** * Verifies that bold formatting in a prefix does not leak into the * surrounding message text after substitution. - * @see Bold text continues */ @Test void testPrefixBoldDoesNotLeak() { From 89c6f113ff2f3275b43e360240ad4592f169aa58 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 5 Apr 2026 13:37:54 -0700 Subject: [PATCH 52/95] Improve warning messages for incompatible addons in AddonsManager --- .../world/bentobox/bentobox/managers/AddonsManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java index eeb4aa8d6..c8c484c91 100644 --- a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java @@ -468,11 +468,11 @@ private void handleAddonIncompatibility(@NonNull Addon addon, LinkageError e) { addon.setState(Addon.State.INCOMPATIBLE); plugin.logWarning("Skipping " + addon.getDescription().getName() + " as it is incompatible with the current version of BentoBox or of server software..."); - plugin.logWarning("NOTE: The addon is referring to no longer existing classes."); - plugin.logWarning("NOTE: DO NOT report this as a bug from BentoBox."); + plugin.logWarning("Do you need to update your BentoBox?"); + plugin.logWarning("NOTE: DO NOT report this as a bug to BentoBox before you update the software."); StringBuilder a = new StringBuilder(); addon.getDescription().getAuthors().forEach(author -> a.append(author).append(" ")); - plugin.logError("Please report this stack trace to the addon's author(s): " + a); + plugin.logError("If you really think this is an error, report this stack trace to the addon's author(s): " + a); plugin.logStacktrace(e); } From 3b124a809f7337896d6715c09389e8a7131112a9 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 5 Apr 2026 13:55:27 -0700 Subject: [PATCH 53/95] Add chunk pre-generation manager with tests and config Introduces ChunkPregenManager which predicts future island locations via the spiral grid algorithm and asynchronously pre-generates chunks around them using Paper's async chunk API, reducing lag spikes on island creation and reset. Adds config.yml entries for the four new pregeneration settings. Co-Authored-By: Claude Sonnet 4.6 --- .../world/bentobox/bentobox/BentoBox.java | 15 +- .../world/bentobox/bentobox/Settings.java | 90 +++++ .../bentobox/api/addons/GameModeAddon.java | 17 + .../listeners/BentoBoxListenerRegistrar.java | 12 + .../bentobox/managers/ChunkPregenManager.java | 332 +++++++++++++++ src/main/resources/config.yml | 20 + .../managers/ChunkPregenManagerTest.java | 378 ++++++++++++++++++ 7 files changed, 863 insertions(+), 1 deletion(-) create mode 100644 src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java create mode 100644 src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java diff --git a/src/main/java/world/bentobox/bentobox/BentoBox.java b/src/main/java/world/bentobox/bentobox/BentoBox.java index ade58f260..b97654e6c 100644 --- a/src/main/java/world/bentobox/bentobox/BentoBox.java +++ b/src/main/java/world/bentobox/bentobox/BentoBox.java @@ -31,6 +31,7 @@ import world.bentobox.bentobox.managers.CommandsManager; import world.bentobox.bentobox.managers.FlagsManager; import world.bentobox.bentobox.managers.HooksManager; +import world.bentobox.bentobox.managers.ChunkPregenManager; import world.bentobox.bentobox.managers.IslandDeletionManager; import world.bentobox.bentobox.managers.IslandWorldManager; import world.bentobox.bentobox.managers.IslandsManager; @@ -70,6 +71,7 @@ public class BentoBox extends JavaPlugin implements Listener { private PlaceholdersManager placeholdersManager; private MapManager mapManager; private IslandDeletionManager islandDeletionManager; + private ChunkPregenManager chunkPregenManager; private WebManager webManager; // Settings @@ -283,6 +285,7 @@ private void registerListeners() { BentoBoxListenerRegistrar registrar = new BentoBoxListenerRegistrar(this); registrar.register(); islandDeletionManager = registrar.getIslandDeletionManager(); + chunkPregenManager = registrar.getChunkPregenManager(); } @Override @@ -302,7 +305,9 @@ public void onDisable() { if (islandsManager != null) { islandsManager.shutdown(); } - + if (chunkPregenManager != null) { + chunkPregenManager.shutdown(); + } } @@ -553,6 +558,14 @@ public IslandDeletionManager getIslandDeletionManager() { return islandDeletionManager; } + /** + * @return the chunkPregenManager + * @since 3.14.0 + */ + public ChunkPregenManager getChunkPregenManager() { + return chunkPregenManager; + } + /** * @return an optional of the Bstats instance * @since 1.1 diff --git a/src/main/java/world/bentobox/bentobox/Settings.java b/src/main/java/world/bentobox/bentobox/Settings.java index 6ad2d1ab5..41f869604 100644 --- a/src/main/java/world/bentobox/bentobox/Settings.java +++ b/src/main/java/world/bentobox/bentobox/Settings.java @@ -340,6 +340,32 @@ public class Settings implements ConfigObject { @ConfigEntry(path = "island.deletion.slow-deletion", since = "1.19.1") private boolean slowDeletion = false; + // Chunk pre-generation settings + @ConfigComment("") + @ConfigComment("Chunk pre-generation settings.") + @ConfigComment("Pre-generates chunks around predicted future island locations") + @ConfigComment("to reduce lag when islands are created or reset.") + @ConfigComment("") + @ConfigComment("Enable or disable chunk pre-generation.") + @ConfigEntry(path = "island.pregeneration.enabled", since = "3.14.0") + private boolean pregenEnabled = true; + + @ConfigComment("Number of future islands to pre-generate chunks for, per game mode world.") + @ConfigComment("Higher values use more disk space but reduce the chance of lag on island creation.") + @ConfigEntry(path = "island.pregeneration.islands-ahead", since = "3.14.0") + private int pregenIslandsAhead = 3; + + @ConfigComment("Maximum number of async chunk generation requests dispatched per tick batch.") + @ConfigComment("Lower values reduce server impact. Paper handles these asynchronously.") + @ConfigComment("Recommended range: 2-10.") + @ConfigEntry(path = "island.pregeneration.chunks-per-tick", since = "3.14.0") + private int pregenChunksPerTick = 4; + + @ConfigComment("Ticks between pre-generation batches.") + @ConfigComment("1 = every tick (fastest), 20 = once per second (gentlest).") + @ConfigEntry(path = "island.pregeneration.tick-interval", since = "3.14.0") + private int pregenTickInterval = 5; + @ConfigComment("By default, If the destination is not safe, the plugin will try to search for a safe spot around the destination,") @ConfigComment("then it will try to expand the y-coordinate up and down from the destination.") @ConfigComment("This setting limits how far the y-coordinate will be expanded.") @@ -995,6 +1021,70 @@ public void setSlowDeletion(boolean slowDeletion) { this.slowDeletion = slowDeletion; } + /** + * @return whether chunk pre-generation is enabled + * @since 3.14.0 + */ + public boolean isPregenEnabled() { + return pregenEnabled; + } + + /** + * @param pregenEnabled whether chunk pre-generation is enabled + * @since 3.14.0 + */ + public void setPregenEnabled(boolean pregenEnabled) { + this.pregenEnabled = pregenEnabled; + } + + /** + * @return number of future islands to pre-generate per game mode + * @since 3.14.0 + */ + public int getPregenIslandsAhead() { + return pregenIslandsAhead; + } + + /** + * @param pregenIslandsAhead number of future islands to pre-generate + * @since 3.14.0 + */ + public void setPregenIslandsAhead(int pregenIslandsAhead) { + this.pregenIslandsAhead = pregenIslandsAhead; + } + + /** + * @return max async chunk generation requests per tick batch + * @since 3.14.0 + */ + public int getPregenChunksPerTick() { + return pregenChunksPerTick; + } + + /** + * @param pregenChunksPerTick max async chunk requests per tick + * @since 3.14.0 + */ + public void setPregenChunksPerTick(int pregenChunksPerTick) { + this.pregenChunksPerTick = pregenChunksPerTick; + } + + /** + * @return ticks between pre-generation batches + * @since 3.14.0 + */ + public int getPregenTickInterval() { + return pregenTickInterval; + } + + /** + * @param pregenTickInterval ticks between batches + * @since 3.14.0 + */ + public void setPregenTickInterval(int pregenTickInterval) { + this.pregenTickInterval = pregenTickInterval; + } + /** * Gets maximum pool size. * diff --git a/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java b/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java index fd891d261..4c239313f 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java @@ -199,4 +199,21 @@ public boolean isFixIslandCenter() { public boolean isEnforceEqualRanges() { return true; } + + /** + * Returns the number of islands to pre-generate chunks for in this game mode. + *

+ * Override this method to customize pre-generation for your addon: + *

    + *
  • {@code -1} — use the global BentoBox setting (default)
  • + *
  • {@code 0} — disable pre-generation for this addon
  • + *
  • positive value — pre-generate this many islands ahead
  • + *
+ * + * @return number of islands ahead, -1 for global default, 0 to disable + * @since 3.14.0 + */ + public int getPregenIslandsAhead() { + return -1; + } } diff --git a/src/main/java/world/bentobox/bentobox/listeners/BentoBoxListenerRegistrar.java b/src/main/java/world/bentobox/bentobox/listeners/BentoBoxListenerRegistrar.java index 0353e8804..b814405f0 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/BentoBoxListenerRegistrar.java +++ b/src/main/java/world/bentobox/bentobox/listeners/BentoBoxListenerRegistrar.java @@ -5,6 +5,7 @@ import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.listeners.teleports.EntityTeleportListener; import world.bentobox.bentobox.listeners.teleports.PlayerTeleportListener; +import world.bentobox.bentobox.managers.ChunkPregenManager; import world.bentobox.bentobox.managers.IslandDeletionManager; /** @@ -15,6 +16,7 @@ public class BentoBoxListenerRegistrar { private final BentoBox plugin; private IslandDeletionManager islandDeletionManager; + private ChunkPregenManager chunkPregenManager; public BentoBoxListenerRegistrar(BentoBox plugin) { this.plugin = plugin; @@ -37,6 +39,8 @@ public void register() { manager.registerEvents(plugin, plugin); islandDeletionManager = new IslandDeletionManager(plugin); manager.registerEvents(islandDeletionManager, plugin); + chunkPregenManager = new ChunkPregenManager(plugin); + manager.registerEvents(chunkPregenManager, plugin); manager.registerEvents(new PrimaryIslandListener(plugin), plugin); } @@ -46,4 +50,12 @@ public void register() { public IslandDeletionManager getIslandDeletionManager() { return islandDeletionManager; } + + /** + * @return the {@link ChunkPregenManager} created during registration. + * @since 3.14.0 + */ + public ChunkPregenManager getChunkPregenManager() { + return chunkPregenManager; + } } diff --git a/src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java b/src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java new file mode 100644 index 000000000..196190c98 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java @@ -0,0 +1,332 @@ +package world.bentobox.bentobox.managers; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitTask; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.events.BentoBoxReadyEvent; +import world.bentobox.bentobox.api.events.island.IslandCreatedEvent; +import world.bentobox.bentobox.api.events.island.IslandResettedEvent; +import world.bentobox.bentobox.util.Util; + +/** + * Manages chunk pre-generation for island worlds. + *

+ * Predicts where the next islands will be placed (using the spiral grid algorithm) + * and pre-generates chunks around those locations asynchronously using Paper's + * async chunk API. This reduces lag spikes when players create or reset islands. + *

+ * The manager coordinates pre-generation across all registered game mode addons, + * round-robining between worlds to ensure fairness and prevent server overload. + * + * @author tastybento + * @since 3.14.0 + */ +public class ChunkPregenManager implements Listener { + + private record ChunkCoord(World world, int chunkX, int chunkZ) {} + + private final BentoBox plugin; + private final Map> chunkQueues = new ConcurrentHashMap<>(); + private final List activeWorlds = new ArrayList<>(); + private BukkitTask schedulerTask; + private int roundRobinIndex; + + public ChunkPregenManager(BentoBox plugin) { + this.plugin = plugin; + } + + /** + * Starts pre-generation for all game mode addons when BentoBox is fully loaded. + * + * @param e the ready event + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBentoBoxReady(BentoBoxReadyEvent e) { + if (!plugin.getSettings().isPregenEnabled()) { + return; + } + plugin.getAddonsManager().getGameModeAddons().forEach(this::schedulePregen); + startTask(); + } + + /** + * Re-triggers pre-generation when a new island is created (prediction window shifts). + * + * @param e the island created event + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onIslandCreated(IslandCreatedEvent e) { + if (!plugin.getSettings().isPregenEnabled()) { + return; + } + World world = e.getIsland().getWorld(); + plugin.getIWM().getAddon(world).ifPresent(this::schedulePregen); + } + + /** + * Re-triggers pre-generation when an island is reset (prediction window shifts). + * + * @param e the island resetted event + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onIslandResetted(IslandResettedEvent e) { + if (!plugin.getSettings().isPregenEnabled()) { + return; + } + World world = e.getIsland().getWorld(); + plugin.getIWM().getAddon(world).ifPresent(this::schedulePregen); + } + + /** + * Computes the chunks that need pre-generating for the given addon and queues them. + * + * @param addon the game mode addon + */ + public void schedulePregen(GameModeAddon addon) { + if (!addon.isFixIslandCenter()) { + // Non-grid addons can't be predicted + return; + } + + World overworld = addon.getOverWorld(); + if (overworld == null) { + return; + } + + int islandsAhead = addon.getPregenIslandsAhead(); + if (islandsAhead == -1) { + islandsAhead = plugin.getSettings().getPregenIslandsAhead(); + } + if (islandsAhead <= 0) { + return; + } + + int islandDistance = plugin.getIWM().getIslandDistance(overworld) * 2; + Location last = plugin.getIslands().getLast(overworld); + if (last == null) { + last = new Location(overworld, + (double) plugin.getIWM().getIslandXOffset(overworld) + plugin.getIWM().getIslandStartX(overworld), + plugin.getIWM().getIslandHeight(overworld), + (double) plugin.getIWM().getIslandZOffset(overworld) + plugin.getIWM().getIslandStartZ(overworld)); + } + + List predicted = predictNextLocations(overworld, last, islandsAhead, islandDistance); + + // Determine which worlds need chunks + List worlds = new ArrayList<>(); + worlds.add(overworld); + if (plugin.getIWM().isNetherGenerate(overworld) && plugin.getIWM().isNetherIslands(overworld)) { + World nether = plugin.getIWM().getNetherWorld(overworld); + if (nether != null) { + worlds.add(nether); + } + } + if (plugin.getIWM().isEndGenerate(overworld) && plugin.getIWM().isEndIslands(overworld)) { + World end = plugin.getIWM().getEndWorld(overworld); + if (end != null) { + worlds.add(end); + } + } + + int viewDistance = Bukkit.getViewDistance(); + + // Build chunk queue, interleaving dimensions for round-robin within each island + Deque queue = new ArrayDeque<>(); + for (Location center : predicted) { + int centerChunkX = center.getBlockX() >> 4; + int centerChunkZ = center.getBlockZ() >> 4; + + // Collect chunks per world + List> perWorld = new ArrayList<>(); + for (World w : worlds) { + List chunks = new ArrayList<>(); + for (int dx = -viewDistance; dx <= viewDistance; dx++) { + for (int dz = -viewDistance; dz <= viewDistance; dz++) { + int cx = centerChunkX + dx; + int cz = centerChunkZ + dz; + if (!Util.isChunkGenerated(w, cx, cz)) { + chunks.add(new ChunkCoord(w, cx, cz)); + } + } + } + perWorld.add(chunks); + } + + // Interleave: take one from each world in turn + boolean hasMore = true; + int idx = 0; + while (hasMore) { + hasMore = false; + for (List chunks : perWorld) { + if (idx < chunks.size()) { + queue.add(chunks.get(idx)); + hasMore = true; + } + } + idx++; + } + } + + if (!queue.isEmpty()) { + chunkQueues.put(overworld, queue); + plugin.log("Chunk pre-generation: queued " + queue.size() + " chunks for " + overworld.getName() + + " (" + predicted.size() + " islands ahead, " + worlds.size() + " dimension(s))"); + updateActiveWorlds(); + startTask(); + } + } + + /** + * Predicts the next N island locations by walking the spiral grid. + * This is a pure function — it does not modify any state. + * + * @param world the world + * @param start the starting location (last known island position) + * @param count number of locations to predict + * @param islandDistance the distance between island centers (island distance * 2) + * @return list of predicted island center locations + */ + static List predictNextLocations(World world, Location start, int count, int islandDistance) { + List locations = new ArrayList<>(count); + // Clone to avoid mutating the original + Location pos = start.clone(); + for (int i = 0; i < count; i++) { + nextGridLocation(pos, islandDistance); + locations.add(pos.clone()); + } + return locations; + } + + /** + * Moves the location to the next position in the outward square spiral. + * Same algorithm as {@code DefaultNewIslandLocationStrategy.nextGridLocation}. + * + * @param loc the location to modify in-place + * @param d the step distance between island centers + */ + private static void nextGridLocation(Location loc, int d) { + int x = loc.getBlockX(); + int z = loc.getBlockZ(); + if (x < z) { + if (-x < z) { + loc.setX(loc.getX() + d); + } else { + loc.setZ(loc.getZ() + d); + } + } else if (x > z) { + if (-x >= z) { + loc.setX(loc.getX() - d); + } else { + loc.setZ(loc.getZ() - d); + } + } else { + if (x <= 0) { + loc.setZ(loc.getZ() + d); + } else { + loc.setZ(loc.getZ() - d); + } + } + } + + /** + * Starts the repeating task if not already running. + */ + private void startTask() { + if (schedulerTask != null && !schedulerTask.isCancelled()) { + return; + } + int tickInterval = Math.max(1, plugin.getSettings().getPregenTickInterval()); + schedulerTask = Bukkit.getScheduler().runTaskTimer(plugin, this::tick, tickInterval, tickInterval); + } + + /** + * Processes one batch of chunk generation requests across all worlds. + */ + private void tick() { + if (activeWorlds.isEmpty()) { + // Nothing to do, cancel task + if (schedulerTask != null) { + schedulerTask.cancel(); + schedulerTask = null; + } + return; + } + + int chunksPerTick = plugin.getSettings().getPregenChunksPerTick(); + int dispatched = 0; + int worldsChecked = 0; + + while (dispatched < chunksPerTick && worldsChecked < activeWorlds.size()) { + if (roundRobinIndex >= activeWorlds.size()) { + roundRobinIndex = 0; + } + + World world = activeWorlds.get(roundRobinIndex); + Deque queue = chunkQueues.get(world); + + if (queue == null || queue.isEmpty()) { + chunkQueues.remove(world); + activeWorlds.remove(roundRobinIndex); + if (activeWorlds.isEmpty()) { + plugin.log("Chunk pre-generation: all queues complete"); + break; + } + // Don't increment index since list shifted + continue; + } + + // Dispatch a fair share for this world + int batchSize = Math.max(1, chunksPerTick / activeWorlds.size()); + for (int i = 0; i < batchSize && dispatched < chunksPerTick && !queue.isEmpty(); i++) { + ChunkCoord coord = queue.poll(); + // Double-check: skip if already generated since queueing + if (!Util.isChunkGenerated(coord.world(), coord.chunkX(), coord.chunkZ())) { + Util.getChunkAtAsync(coord.world(), coord.chunkX(), coord.chunkZ()); + dispatched++; + } + } + + roundRobinIndex++; + worldsChecked++; + } + } + + /** + * Rebuilds the active worlds list from non-empty queues. + */ + private void updateActiveWorlds() { + activeWorlds.clear(); + chunkQueues.forEach((world, queue) -> { + if (!queue.isEmpty()) { + activeWorlds.add(world); + } + }); + roundRobinIndex = 0; + } + + /** + * Shuts down the pre-generation task. + */ + public void shutdown() { + if (schedulerTask != null) { + schedulerTask.cancel(); + schedulerTask = null; + } + chunkQueues.clear(); + activeWorlds.clear(); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6ad59ec9d..e1bf39a86 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -224,6 +224,26 @@ island: # This is slower but will not cause any impact on the performance. # Added since 1.19.1. slow-deletion: false + pregeneration: + # Chunk pre-generation settings. + # Pre-generates chunks around predicted future island locations + # to reduce lag when islands are created or reset. + # Enable or disable chunk pre-generation. + # Added since 3.14.0. + enabled: true + # Number of future islands to pre-generate chunks for, per game mode world. + # Higher values use more disk space but reduce the chance of lag on island creation. + # Added since 3.14.0. + islands-ahead: 3 + # Maximum number of async chunk generation requests dispatched per tick batch. + # Lower values reduce server impact. Paper handles these asynchronously. + # Recommended range: 2-10. + # Added since 3.14.0. + chunks-per-tick: 4 + # Ticks between pre-generation batches. + # 1 = every tick (fastest), 20 = once per second (gentlest). + # Added since 3.14.0. + tick-interval: 5 # By default, If the destination is not safe, the plugin will try to search for a safe spot around the destination, # then it will try to expand the y-coordinate up and down from the destination. # This setting limits how far the y-coordinate will be expanded. diff --git a/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java new file mode 100644 index 000000000..6ca65bf17 --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java @@ -0,0 +1,378 @@ +package world.bentobox.bentobox.managers; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.scheduler.BukkitTask; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; + +import world.bentobox.bentobox.CommonTestSetup; +import world.bentobox.bentobox.Settings; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.events.BentoBoxReadyEvent; +import world.bentobox.bentobox.api.events.island.IslandCreatedEvent; +import world.bentobox.bentobox.api.events.island.IslandResettedEvent; +import world.bentobox.bentobox.util.Util; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ChunkPregenManagerTest extends CommonTestSetup { + + @Mock + private GameModeAddon addon; + @Mock + private World netherWorld; + @Mock + private World endWorld; + @Mock + private BukkitTask task; + @Mock + private AddonsManager addonsManager; + @Mock + private IslandCreatedEvent createdEvent; + @Mock + private IslandResettedEvent resettedEvent; + @Mock + private BentoBoxReadyEvent readyEvent; + + private ChunkPregenManager manager; + private Settings settings; + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); + + // Scheduler returns a cancellable task + when(sch.runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong())).thenReturn(task); + when(task.isCancelled()).thenReturn(false); + + // Bukkit.getViewDistance() — small value keeps queue sizes manageable in tests + mockedBukkit.when(Bukkit::getViewDistance).thenReturn(2); + + // Addon wiring + when(addon.isFixIslandCenter()).thenReturn(true); + when(addon.getPregenIslandsAhead()).thenReturn(-1); // use global default + when(addon.getOverWorld()).thenReturn(world); + when(addon.getNetherWorld()).thenReturn(netherWorld); + when(addon.getEndWorld()).thenReturn(endWorld); + + // IWM + when(iwm.getAddon(any(World.class))).thenReturn(Optional.of(addon)); + when(iwm.getIslandDistance(world)).thenReturn(100); + when(iwm.getIslandXOffset(world)).thenReturn(0); + when(iwm.getIslandZOffset(world)).thenReturn(0); + when(iwm.getIslandStartX(world)).thenReturn(0); + when(iwm.getIslandStartZ(world)).thenReturn(0); + when(iwm.getIslandHeight(world)).thenReturn(64); + when(iwm.isNetherGenerate(world)).thenReturn(true); + when(iwm.isNetherIslands(world)).thenReturn(true); + when(iwm.getNetherWorld(world)).thenReturn(netherWorld); + when(iwm.isEndGenerate(world)).thenReturn(true); + when(iwm.isEndIslands(world)).thenReturn(true); + when(iwm.getEndWorld(world)).thenReturn(endWorld); + + // IslandsManager — null last triggers real Location construction from IWM start values + when(im.getLast(world)).thenReturn(null); + + // AddonsManager + when(plugin.getAddonsManager()).thenReturn(addonsManager); + when(addonsManager.getGameModeAddons()).thenReturn(List.of(addon)); + + // Util static stubs — all chunks ungenerated so queues are non-empty + mockedUtil.when(() -> Util.isChunkGenerated(any(World.class), anyInt(), anyInt())).thenReturn(false); + mockedUtil.when(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt())) + .thenReturn(CompletableFuture.completedFuture(null)); + + // plugin.log() — avoid NPE; real Settings already wired by CommonTestSetup + doNothing().when(plugin).log(anyString()); + + // Grab the real Settings so we can mutate it per-test + settings = plugin.getSettings(); + + manager = new ChunkPregenManager(plugin); + } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } + + // ----------------------------------------------------------------------- + // Constructor + // ----------------------------------------------------------------------- + + @Test + void testConstructor() { + assertNotNull(manager); + } + + // ----------------------------------------------------------------------- + // onBentoBoxReady + // ----------------------------------------------------------------------- + + @Test + void testOnBentoBoxReady_pregenDisabled() { + settings.setPregenEnabled(false); + manager.onBentoBoxReady(readyEvent); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testOnBentoBoxReady_pregenEnabled() { + manager.onBentoBoxReady(readyEvent); + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + // ----------------------------------------------------------------------- + // onIslandCreated + // ----------------------------------------------------------------------- + + @Test + void testOnIslandCreated_pregenDisabled() { + settings.setPregenEnabled(false); + when(createdEvent.getIsland()).thenReturn(island); + when(island.getWorld()).thenReturn(world); + manager.onIslandCreated(createdEvent); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testOnIslandCreated_pregenEnabled() { + when(createdEvent.getIsland()).thenReturn(island); + when(island.getWorld()).thenReturn(world); + manager.onIslandCreated(createdEvent); + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + // ----------------------------------------------------------------------- + // onIslandResetted + // ----------------------------------------------------------------------- + + @Test + void testOnIslandResetted_pregenDisabled() { + settings.setPregenEnabled(false); + when(resettedEvent.getIsland()).thenReturn(island); + when(island.getWorld()).thenReturn(world); + manager.onIslandResetted(resettedEvent); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testOnIslandResetted_pregenEnabled() { + when(resettedEvent.getIsland()).thenReturn(island); + when(island.getWorld()).thenReturn(world); + manager.onIslandResetted(resettedEvent); + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + // ----------------------------------------------------------------------- + // schedulePregen — early exit paths + // ----------------------------------------------------------------------- + + @Test + void testSchedulePregen_nonGridAddon() { + when(addon.isFixIslandCenter()).thenReturn(false); + manager.schedulePregen(addon); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testSchedulePregen_nullOverworld() { + when(addon.getOverWorld()).thenReturn(null); + manager.schedulePregen(addon); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testSchedulePregen_zeroIslandsAhead_addonOverride() { + when(addon.getPregenIslandsAhead()).thenReturn(0); + manager.schedulePregen(addon); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testSchedulePregen_zeroIslandsAhead_globalDefault() { + // addon defers to global; global setting also 0 + when(addon.getPregenIslandsAhead()).thenReturn(-1); + settings.setPregenIslandsAhead(0); + manager.schedulePregen(addon); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + // ----------------------------------------------------------------------- + // schedulePregen — happy paths + // ----------------------------------------------------------------------- + + @Test + void testSchedulePregen_globalDefault_queuesChunks() { + // Default: 3 islands ahead, viewDistance 2 → each island (2*2+1)^2 = 25 chunks × 3 worlds × 3 islands + manager.schedulePregen(addon); + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + + // Drive the tick so chunks are dispatched + ArgumentCaptor cap = ArgumentCaptor.forClass(Runnable.class); + verify(sch).runTaskTimer(eq(plugin), cap.capture(), anyLong(), anyLong()); + cap.getValue().run(); + + // At least one chunk async request should have been made + mockedUtil.verify(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt()), + org.mockito.Mockito.atLeastOnce()); + } + + @Test + void testSchedulePregen_addonOverridesIslandsAhead() { + when(addon.getPregenIslandsAhead()).thenReturn(5); + manager.schedulePregen(addon); + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testSchedulePregen_noNetherOrEnd() { + when(iwm.isNetherGenerate(world)).thenReturn(false); + when(iwm.isNetherIslands(world)).thenReturn(false); + when(iwm.isEndGenerate(world)).thenReturn(false); + when(iwm.isEndIslands(world)).thenReturn(false); + manager.schedulePregen(addon); + // Should still queue overworld chunks and start task + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testSchedulePregen_netherNullWorld() { + // isNetherGenerate & isNetherIslands true but getNetherWorld returns null + when(iwm.getNetherWorld(world)).thenReturn(null); + manager.schedulePregen(addon); + // Overworld chunks still queued; task still starts + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testSchedulePregen_withNonNullLastLocation() { + // Provide a real Location as "last" — predictNextLocations must still work + Location last = new Location(world, 200, 64, 0); + when(im.getLast(world)).thenReturn(last); + manager.schedulePregen(addon); + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testSchedulePregen_allChunksAlreadyGenerated_noTask() { + // If every chunk is already generated the queue stays empty → no task + mockedUtil.when(() -> Util.isChunkGenerated(any(World.class), anyInt(), anyInt())).thenReturn(true); + manager.schedulePregen(addon); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + + // ----------------------------------------------------------------------- + // predictNextLocations (package-private static — same package access) + // ----------------------------------------------------------------------- + + @Test + void testPredictNextLocations_returnsCorrectCount() { + Location start = new Location(world, 0, 64, 0); + List result = ChunkPregenManager.predictNextLocations(world, start, 5, 200); + assertEquals(5, result.size()); + } + + @Test + void testPredictNextLocations_doesNotMutateStart() { + Location start = new Location(world, 0, 64, 0); + ChunkPregenManager.predictNextLocations(world, start, 3, 200); + // Original start should not be modified + assertEquals(0, start.getBlockX()); + assertEquals(0, start.getBlockZ()); + } + + @Test + void testPredictNextLocations_spiralFirstStep() { + // From (0,0) the spiral first moves in the +x direction (x >= z and x <= 0 edge → z+d) + // Actually: x=0, z=0 → x==z and x<=0 → setZ(z+d) + Location start = new Location(world, 0, 64, 0); + List result = ChunkPregenManager.predictNextLocations(world, start, 1, 100); + Location first = result.get(0); + // x stays 0, z moves to +100 + assertEquals(0, first.getBlockX()); + assertEquals(100, first.getBlockZ()); + } + + @Test + void testPredictNextLocations_emptyWhenCountZero() { + Location start = new Location(world, 0, 64, 0); + List result = ChunkPregenManager.predictNextLocations(world, start, 0, 200); + assertEquals(0, result.size()); + } + + // ----------------------------------------------------------------------- + // shutdown + // ----------------------------------------------------------------------- + + @Test + void testShutdown_cancelsRunningTask() { + manager.schedulePregen(addon); // creates task + manager.shutdown(); + verify(task).cancel(); + } + + @Test + void testShutdown_noTaskRunning_noException() { + // Shutdown without ever scheduling — must not throw + manager.shutdown(); + verify(task, never()).cancel(); + } + + // ----------------------------------------------------------------------- + // tick — auto-cancel when all queues empty + // ----------------------------------------------------------------------- + + @Test + void testTick_autoCancel_whenQueuesEmpty() { + manager.schedulePregen(addon); + + ArgumentCaptor cap = ArgumentCaptor.forClass(Runnable.class); + verify(sch).runTaskTimer(eq(plugin), cap.capture(), anyLong(), anyLong()); + + // Clear all queues by shutting down, then verify task was cancelled + manager.shutdown(); + verify(task).cancel(); + + // Run tick again with a fresh (cancelled) state — activeWorlds is empty so it + // should cancel the new task reference (which is null after shutdown) + // Just assert no exception is thrown + cap.getValue().run(); + } + + @Test + void testTick_dispatchesChunksWhenQueued() { + manager.schedulePregen(addon); + + ArgumentCaptor cap = ArgumentCaptor.forClass(Runnable.class); + verify(sch).runTaskTimer(eq(plugin), cap.capture(), anyLong(), anyLong()); + + cap.getValue().run(); // one tick + + // Verify async chunk requests were issued + mockedUtil.verify(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt()), + org.mockito.Mockito.atLeastOnce()); + } +} From 34ddde3b4337c7a71a19be03afedee833cf6e802 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 21:55:54 +0000 Subject: [PATCH 54/95] Initial plan From 1929b193609e64f25a6483b55d65aec7285c980c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 21:58:37 +0000 Subject: [PATCH 55/95] Initial plan From 425692fa231004a247899218400e1f8117545173 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:03:18 +0000 Subject: [PATCH 56/95] test: add VISITED_ISLAND_RANK assertions to GameModePlaceholderTest Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/f271de13-721d-4fbd-a5be-f8ee679445b3 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../world/bentobox/bentobox/lists/GameModePlaceholderTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/java/world/bentobox/bentobox/lists/GameModePlaceholderTest.java b/src/test/java/world/bentobox/bentobox/lists/GameModePlaceholderTest.java index d39cbf425..5771b063f 100644 --- a/src/test/java/world/bentobox/bentobox/lists/GameModePlaceholderTest.java +++ b/src/test/java/world/bentobox/bentobox/lists/GameModePlaceholderTest.java @@ -225,6 +225,8 @@ void testGetReplacerVisitedIslands() { GameModePlaceholder.VISITED_ISLAND_PROTECTION_RANGE.getReplacer().onReplace(addon, user, island)); assertEquals("0", GameModePlaceholder.VISITED_ISLAND_PROTECTION_RANGE_DIAMETER.getReplacer().onReplace(addon, user, island)); + assertEquals("ranks.owner", + GameModePlaceholder.VISITED_ISLAND_RANK.getReplacer().onReplace(addon, user, island)); assertEquals("1", GameModePlaceholder.VISITED_ISLAND_TRUSTEES_COUNT.getReplacer().onReplace(addon, user, island)); assertEquals(uuid.toString(), @@ -253,6 +255,7 @@ void testGetReplacerVisitedIslandsNoIsland() { assertEquals("", GameModePlaceholder.VISITED_ISLAND_OWNER.getReplacer().onReplace(addon, user, island)); assertEquals("", GameModePlaceholder.VISITED_ISLAND_PROTECTION_RANGE.getReplacer().onReplace(addon, user, island)); assertEquals("", GameModePlaceholder.VISITED_ISLAND_PROTECTION_RANGE_DIAMETER.getReplacer().onReplace(addon, user, island)); + assertEquals("", GameModePlaceholder.VISITED_ISLAND_RANK.getReplacer().onReplace(addon, user, island)); assertEquals("", GameModePlaceholder.VISITED_ISLAND_TRUSTEES_COUNT.getReplacer().onReplace(addon, user, island)); assertEquals("", GameModePlaceholder.VISITED_ISLAND_UUID.getReplacer().onReplace(addon, user, island)); assertEquals("", GameModePlaceholder.VISITED_ISLAND_VISITORS_COUNT.getReplacer().onReplace(addon, user, island)); From 5b034eba70604fa43d3dbc7530a235554aab5ced Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:05:04 +0000 Subject: [PATCH 57/95] Initial plan From 31ceb9cdf011e025979064456bb66db4803250a8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:10:18 +0000 Subject: [PATCH 58/95] feat: Add message delivery type tags for locale strings (actionbar, title, subtitle, sound) Support [actionbar], [title]/[subtitle], and [sound:name:volume:pitch] tags in locale messages to control how messages are displayed to players. Default behavior (chat) is unchanged when no tags are present. Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/21e50d67-9ea0-4b84-a480-1acf200c05cc Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../bentobox/bentobox/api/user/User.java | 109 ++++++++++++++++-- .../bentobox/bentobox/api/user/UserTest.java | 72 ++++++++++++ 2 files changed, 174 insertions(+), 7 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/user/User.java b/src/main/java/world/bentobox/bentobox/api/user/User.java index 55b3ca47b..6299e7a63 100644 --- a/src/main/java/world/bentobox/bentobox/api/user/User.java +++ b/src/main/java/world/bentobox/bentobox/api/user/User.java @@ -41,6 +41,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.title.Title; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.events.OfflineMessageEvent; @@ -66,6 +67,12 @@ public class User implements MetaDataAble { private static final Map users = new HashMap<>(); + // Patterns for message delivery type tags in locale strings + private static final Pattern ACTIONBAR_PATTERN = Pattern.compile("^\\[actionbar]", Pattern.CASE_INSENSITIVE); + private static final Pattern TITLE_PATTERN = Pattern.compile("^\\[title]", Pattern.CASE_INSENSITIVE); + private static final Pattern SUBTITLE_PATTERN = Pattern.compile("\\[subtitle]", Pattern.CASE_INSENSITIVE); + private static final Pattern SOUND_PATTERN = Pattern.compile("\\[sound:([^:\\]]+)(?::([^:\\]]+))?(?::([^:\\]]+))?]", Pattern.CASE_INSENSITIVE); + // Used for particle validation private static final Map> VALIDATION_CHECK; static { @@ -684,19 +691,107 @@ public void sendMessage(String reference, String... variables) { * * The above message will display "Hello [not-a-command: hello] World" where clicking the message runs the "/help" command, * and hovering over the message shows "This is a hover text". + *

+ * Additionally, the method supports message delivery type tags: + *

    + *
  • [actionbar] - Sends the message as an action bar message.
  • + *
  • [title] - Sends the message as a title. Optionally use [subtitle] to split title and subtitle.
  • + *
  • [sound:name:volume:pitch] - Plays the specified sound to the player. Volume and pitch are optional (default 1.0).
  • + *
* * @param message The message to send, containing inline commands in square brackets. */ public void sendRawMessage(String message) { - if (sender != null) { - // Convert inline bracket commands to MiniMessage tags - String mmMessage = Util.convertInlineCommandsToMiniMessage(message); - // Auto-detect and parse legacy or MiniMessage format - Component component = Util.parseMiniMessageOrLegacy(mmMessage); - sender.sendMessage(component); - } else { + if (sender == null) { Bukkit.getPluginManager().callEvent(new OfflineMessageEvent(this.playerUUID, message)); + return; + } + + // Extract and play sounds first (can combine with any delivery type) + String remaining = processAndStripSounds(message); + + // Determine delivery type and dispatch + if (ACTIONBAR_PATTERN.matcher(remaining).find()) { + String text = ACTIONBAR_PATTERN.matcher(remaining).replaceFirst(""); + Component component = parseToComponent(text); + if (sender instanceof Player player) { + player.sendActionBar(component); + } else { + sender.sendMessage(component); + } + } else if (TITLE_PATTERN.matcher(remaining).find()) { + String text = TITLE_PATTERN.matcher(remaining).replaceFirst(""); + Component titleComponent; + Component subtitleComponent = Component.empty(); + Matcher subtitleMatcher = SUBTITLE_PATTERN.matcher(text); + if (subtitleMatcher.find()) { + String titleText = text.substring(0, subtitleMatcher.start()); + String subtitleText = text.substring(subtitleMatcher.end()); + titleComponent = parseToComponent(titleText); + subtitleComponent = parseToComponent(subtitleText); + } else { + titleComponent = parseToComponent(text); + } + if (sender instanceof Player player) { + player.showTitle(Title.title(titleComponent, subtitleComponent)); + } else { + sender.sendMessage(titleComponent); + } + } else { + // Default: chat message + Component component = parseToComponent(remaining); + sender.sendMessage(component); + } + } + + /** + * Parses a message string into an Adventure Component, handling inline commands and + * auto-detecting legacy or MiniMessage format. + * + * @param text the message text + * @return the parsed Component + */ + private Component parseToComponent(String text) { + String mmMessage = Util.convertInlineCommandsToMiniMessage(text); + return Util.parseMiniMessageOrLegacy(mmMessage); + } + + /** + * Extracts sound tags from the message, plays them for the player, and returns + * the message with sound tags stripped out. + * + * @param message the message possibly containing [sound:name:volume:pitch] tags + * @return the message with sound tags removed + */ + private String processAndStripSounds(String message) { + Matcher matcher = SOUND_PATTERN.matcher(message); + StringBuilder sb = new StringBuilder(); + while (matcher.find()) { + // Convert underscores to dots and lowercase for Minecraft sound resource location format + String soundName = matcher.group(1).toLowerCase(Locale.ENGLISH).replace('_', '.'); + float volume = 1.0f; + float pitch = 1.0f; + if (matcher.group(2) != null) { + try { + volume = Float.parseFloat(matcher.group(2)); + } catch (NumberFormatException ignored) { + // Use default + } + } + if (matcher.group(3) != null) { + try { + pitch = Float.parseFloat(matcher.group(3)); + } catch (NumberFormatException ignored) { + // Use default + } + } + if (sender instanceof Player player) { + player.playSound(player.getLocation(), soundName, volume, pitch); + } + matcher.appendReplacement(sb, ""); } + matcher.appendTail(sb); + return sb.toString(); } /** diff --git a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java index baa326fc3..b104283aa 100644 --- a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java +++ b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java @@ -45,6 +45,8 @@ import org.mockito.Mock; import org.mockito.stubbing.Answer; +import net.kyori.adventure.text.Component; + import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.CommonTestSetup; import world.bentobox.bentobox.Settings; @@ -363,6 +365,76 @@ void testSendRawMessageNullUser() { checkSpigotMessage(raw, 0); } + @Test + void testSendRawMessageActionBar() { + user.sendRawMessage("[actionbar]Teleporting..."); + verify(mockPlayer).sendActionBar(any(Component.class)); + // Should not be sent as a chat message + verify(mockPlayer, never()).sendMessage(any(Component.class)); + } + + @Test + void testSendRawMessageActionBarCaseInsensitive() { + user.sendRawMessage("[ACTIONBAR]Teleporting..."); + verify(mockPlayer).sendActionBar(any(Component.class)); + } + + @Test + void testSendRawMessageTitle() { + user.sendRawMessage("[title]Teleporting..."); + verify(mockPlayer).showTitle(any(net.kyori.adventure.title.Title.class)); + verify(mockPlayer, never()).sendMessage(any(Component.class)); + } + + @Test + void testSendRawMessageTitleWithSubtitle() { + user.sendRawMessage("[title]Teleporting...[subtitle]Wait a second."); + verify(mockPlayer).showTitle(any(net.kyori.adventure.title.Title.class)); + verify(mockPlayer, never()).sendMessage(any(Component.class)); + } + + @Test + void testSendRawMessageSound() { + when(mockPlayer.getLocation()).thenReturn(location); + user.sendRawMessage("[sound:entity_experience_orb_pickup:1:1]Hello!"); + verify(mockPlayer).playSound(any(Location.class), eq("entity.experience.orb.pickup"), eq(1.0f), eq(1.0f)); + // Message should still be sent as chat + checkSpigotMessage("Hello!"); + } + + @Test + void testSendRawMessageSoundWithTitle() { + when(mockPlayer.getLocation()).thenReturn(location); + user.sendRawMessage("[sound:entity_experience_orb_pickup:1:1][title]Teleporting...[subtitle]Wait a second."); + verify(mockPlayer).playSound(any(Location.class), eq("entity.experience.orb.pickup"), eq(1.0f), eq(1.0f)); + verify(mockPlayer).showTitle(any(net.kyori.adventure.title.Title.class)); + } + + @Test + void testSendRawMessageSoundDefaultVolumeAndPitch() { + when(mockPlayer.getLocation()).thenReturn(location); + user.sendRawMessage("[sound:entity_experience_orb_pickup]Hello!"); + verify(mockPlayer).playSound(any(Location.class), eq("entity.experience.orb.pickup"), eq(1.0f), eq(1.0f)); + } + + @Test + void testSendRawMessageInvalidSound() { + when(mockPlayer.getLocation()).thenReturn(location); + // Even invalid sound names get passed through - Minecraft will silently ignore them + user.sendRawMessage("[sound:not_a_real_sound:1:1]Hello!"); + verify(mockPlayer).playSound(any(Location.class), eq("not.a.real.sound"), eq(1.0f), eq(1.0f)); + // Message should still be sent + checkSpigotMessage("Hello!"); + } + + @Test + void testSendRawMessageActionBarFallbackForNonPlayer() { + // Non-player sender should get the message as regular chat + User senderUser = User.getInstance(sender); + senderUser.sendRawMessage("[actionbar]Teleporting..."); + verify(sender).sendMessage(any(Component.class)); + } + @Test void testNotifyStringStringArrayNotifyOK() { Notifier notifier = mock(Notifier.class); From f2bdf277a36ba360b1c011d982d990a4237ed2d4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:13:34 +0000 Subject: [PATCH 59/95] refactor: Improve Javadoc for sound format conversion and extract parseFloatOrDefault helper Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/21e50d67-9ea0-4b84-a480-1acf200c05cc Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../bentobox/bentobox/api/user/User.java | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/user/User.java b/src/main/java/world/bentobox/bentobox/api/user/User.java index 6299e7a63..935335929 100644 --- a/src/main/java/world/bentobox/bentobox/api/user/User.java +++ b/src/main/java/world/bentobox/bentobox/api/user/User.java @@ -758,7 +758,10 @@ private Component parseToComponent(String text) { /** * Extracts sound tags from the message, plays them for the player, and returns - * the message with sound tags stripped out. + * the message with sound tags stripped out. Sound names use underscores in locale + * files for readability (e.g., {@code entity_experience_orb_pickup}), which are + * converted to Minecraft's dot-separated resource location format + * (e.g., {@code entity.experience.orb.pickup}). * * @param message the message possibly containing [sound:name:volume:pitch] tags * @return the message with sound tags removed @@ -767,24 +770,9 @@ private String processAndStripSounds(String message) { Matcher matcher = SOUND_PATTERN.matcher(message); StringBuilder sb = new StringBuilder(); while (matcher.find()) { - // Convert underscores to dots and lowercase for Minecraft sound resource location format String soundName = matcher.group(1).toLowerCase(Locale.ENGLISH).replace('_', '.'); - float volume = 1.0f; - float pitch = 1.0f; - if (matcher.group(2) != null) { - try { - volume = Float.parseFloat(matcher.group(2)); - } catch (NumberFormatException ignored) { - // Use default - } - } - if (matcher.group(3) != null) { - try { - pitch = Float.parseFloat(matcher.group(3)); - } catch (NumberFormatException ignored) { - // Use default - } - } + float volume = parseFloatOrDefault(matcher.group(2), 1.0f); + float pitch = parseFloatOrDefault(matcher.group(3), 1.0f); if (sender instanceof Player player) { player.playSound(player.getLocation(), soundName, volume, pitch); } @@ -794,6 +782,25 @@ private String processAndStripSounds(String message) { return sb.toString(); } + /** + * Parses a string to a float, returning a default value if the string is null + * or not a valid float. + * + * @param value the string to parse, may be null + * @param defaultValue the default value if parsing fails + * @return the parsed float or the default value + */ + private static float parseFloatOrDefault(@Nullable String value, float defaultValue) { + if (value == null) { + return defaultValue; + } + try { + return Float.parseFloat(value); + } catch (NumberFormatException ignored) { + return defaultValue; + } + } + /** * Sends an Adventure Component directly to the user. * From 6a68cd986982e2af835765edaadacc67bb681f54 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:19:01 +0000 Subject: [PATCH 60/95] Switch blueprints from zipped .blu to plain JSON .blueprint format with backward compatibility - Change BLUEPRINT_SUFFIX from '.blu' to '.blueprint' for new plain JSON format - Add LEGACY_BLUEPRINT_SUFFIX constant for '.blu' backward compatibility - Update BlueprintClipboardManager to save as plain JSON (no zipping) - Update BlueprintClipboardManager to load .blueprint first, fall back to .blu - Update BlueprintsManager to scan for both file formats when loading - Update delete/rename operations to handle both formats - Update admin commands (list, load, save, rename) to support both formats - Update all tests for new format and add legacy backward compatibility tests Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/64819466-6133-4499-98b9-2d03490ea00e Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../blueprints/AdminBlueprintListCommand.java | 11 +- .../blueprints/AdminBlueprintLoadCommand.java | 15 +- .../AdminBlueprintRenameCommand.java | 6 +- .../blueprints/AdminBlueprintSaveCommand.java | 3 +- .../managers/BlueprintClipboardManager.java | 72 +++++---- .../bentobox/managers/BlueprintsManager.java | 51 +++++-- .../BlueprintClipboardManagerTest.java | 139 +++++++++++++----- .../managers/BlueprintsManagerTest.java | 25 +++- 8 files changed, 224 insertions(+), 98 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintListCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintListCommand.java index 27ff01429..e03ea1085 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintListCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintListCommand.java @@ -51,10 +51,17 @@ public boolean execute(User user, String label, List args) return false; } - FilenameFilter blueprintFilter = (File dir, String name) -> name.endsWith(BlueprintsManager.BLUEPRINT_SUFFIX); + FilenameFilter blueprintFilter = (File dir, String name) -> + name.endsWith(BlueprintsManager.BLUEPRINT_SUFFIX) || name.endsWith(BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); List blueprintList = Arrays.stream(Objects.requireNonNull(blueprints.list(blueprintFilter))). - map(name -> name.substring(0, name.length() - BlueprintsManager.BLUEPRINT_SUFFIX.length())). + map(name -> { + if (name.endsWith(BlueprintsManager.BLUEPRINT_SUFFIX)) { + return name.substring(0, name.length() - BlueprintsManager.BLUEPRINT_SUFFIX.length()); + } + return name.substring(0, name.length() - BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX.length()); + }). + distinct(). toList(); if (blueprintList.isEmpty()) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintLoadCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintLoadCommand.java index 4df3be7b6..e9b7f927c 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintLoadCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintLoadCommand.java @@ -17,7 +17,7 @@ public class AdminBlueprintLoadCommand extends CompositeCommand { private static final FilenameFilter BLUEPRINT_FILTER = (File dir, String name) -> name - .endsWith(BlueprintsManager.BLUEPRINT_SUFFIX); + .endsWith(BlueprintsManager.BLUEPRINT_SUFFIX) || name.endsWith(BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); public AdminBlueprintLoadCommand(AdminBlueprintCommand parent) { super(parent, "load"); @@ -54,11 +54,22 @@ public Optional> tabComplete(User user, String alias, List AdminBlueprintCommand parent = (AdminBlueprintCommand) getParent(); File folder = parent.getBlueprintsFolder(); if (folder.exists()) { - options = Arrays.stream(Objects.requireNonNull(folder.list(BLUEPRINT_FILTER))).map(n -> n.substring(0, n.length() - 4)) // remove .blu from filename + options = Arrays.stream(Objects.requireNonNull(folder.list(BLUEPRINT_FILTER))) + .map(AdminBlueprintLoadCommand::removeBlueprintSuffix) .toList(); } String lastArg = !args.isEmpty() ? args.getLast() : ""; return Optional.of(Util.tabLimit(options, lastArg)); } + + private static String removeBlueprintSuffix(String name) { + if (name.endsWith(BlueprintsManager.BLUEPRINT_SUFFIX)) { + return name.substring(0, name.length() - BlueprintsManager.BLUEPRINT_SUFFIX.length()); + } + if (name.endsWith(BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX)) { + return name.substring(0, name.length() - BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX.length()); + } + return name; + } } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintRenameCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintRenameCommand.java index 16c768329..4b145d8f2 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintRenameCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintRenameCommand.java @@ -56,8 +56,9 @@ public boolean canExecute(User user, String label, List args) // Check if the 'from' file exists AdminBlueprintCommand parent = (AdminBlueprintCommand) this.getParent(); File fromFile = new File(parent.getBlueprintsFolder(), from + BlueprintsManager.BLUEPRINT_SUFFIX); + File fromFileLegacy = new File(parent.getBlueprintsFolder(), from + BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); - if (!fromFile.exists()) + if (!fromFile.exists() && !fromFileLegacy.exists()) { user.sendMessage("commands.admin.blueprint.no-such-file"); return false; @@ -78,8 +79,9 @@ public boolean execute(User user, String label, List args) // Check if the 'to' file exists File toFile = new File(parent.getBlueprintsFolder(), to + BlueprintsManager.BLUEPRINT_SUFFIX); + File toFileLegacy = new File(parent.getBlueprintsFolder(), to + BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); - if (toFile.exists()) + if (toFile.exists() || toFileLegacy.exists()) { // Ask for confirmation to overwrite this.askConfirmation(user, diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java index 09a084d89..8b3ebfd11 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java @@ -72,8 +72,9 @@ public boolean execute(User user, String label, List args) // Check if file exists File newFile = new File(parent.getBlueprintsFolder(), fileName + BlueprintsManager.BLUEPRINT_SUFFIX); + File legacyFile = new File(parent.getBlueprintsFolder(), fileName + BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); - if (newFile.exists()) + if (newFile.exists() || legacyFile.exists()) { this.askConfirmation(user, user.getTranslation("commands.admin.blueprint.file-exists"), diff --git a/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java b/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java index ef85d911e..ef5d95355 100644 --- a/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java @@ -13,7 +13,6 @@ import java.nio.file.Paths; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; import org.bukkit.Material; import org.bukkit.util.Vector; @@ -89,14 +88,36 @@ public void load(String fileName) throws IOException { * Loads a blueprint * @param fileName - the sanitized filename without the suffix * @return the blueprint - * @throws IOException exception if there's an issue loading or unzipping + * @throws IOException exception if there's an issue loading */ public Blueprint loadBlueprint(String fileName) throws IOException { - File zipFile = new File(blueprintFolder, fileName + BlueprintsManager.BLUEPRINT_SUFFIX); - if (!zipFile.exists()) { - plugin.logError(LOAD_ERROR + zipFile.getName()); - throw new IOException(LOAD_ERROR + zipFile.getName()); + // Try the new plain JSON format first (.blueprint) + File jsonFile = new File(blueprintFolder, fileName + BlueprintsManager.BLUEPRINT_SUFFIX); + if (jsonFile.exists()) { + return loadBlueprintFromJson(jsonFile, fileName); } + // Fall back to legacy zipped format (.blu) + File zipFile = new File(blueprintFolder, fileName + BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); + if (zipFile.exists()) { + return loadBlueprintFromZip(zipFile, fileName); + } + plugin.logError(LOAD_ERROR + fileName + BlueprintsManager.BLUEPRINT_SUFFIX); + throw new IOException(LOAD_ERROR + fileName + BlueprintsManager.BLUEPRINT_SUFFIX); + } + + private Blueprint loadBlueprintFromJson(File jsonFile, String fileName) throws IOException { + Blueprint bp; + try (FileReader fr = new FileReader(jsonFile, StandardCharsets.UTF_8)) { + bp = gson.fromJson(fr, Blueprint.class); + } catch (Exception e) { + plugin.logError("Blueprint has JSON error: " + jsonFile.getName()); + plugin.logStacktrace(e); + throw new IOException("Blueprint has JSON error: " + jsonFile.getName()); + } + return checkBedrock(bp, fileName + BlueprintsManager.BLUEPRINT_SUFFIX); + } + + private Blueprint loadBlueprintFromZip(File zipFile, String fileName) throws IOException { unzip(zipFile.getCanonicalPath()); File file = new File(blueprintFolder, fileName); if (!file.exists()) { @@ -110,14 +131,16 @@ public Blueprint loadBlueprint(String fileName) throws IOException { plugin.logError("Blueprint has JSON error: " + zipFile.getName()); plugin.logStacktrace(e); throw new IOException("Blueprint has JSON error: " + zipFile.getName()); - } Files.delete(file.toPath()); - // Bedrock check and set + return checkBedrock(bp, fileName + BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); + } + + private Blueprint checkBedrock(Blueprint bp, String fileName) { if (bp.getBedrock() == null) { bp.setBedrock(new Vector(bp.getxSize() / 2, bp.getySize() / 2, bp.getzSize() / 2)); bp.getBlocks().put(bp.getBedrock(), new BlueprintBlock(Material.BEDROCK.createBlockData().getAsString())); - plugin.logWarning("Blueprint " + fileName + BlueprintsManager.BLUEPRINT_SUFFIX + " had no bedrock block in it so one was added automatically in the center. You should check it."); + plugin.logWarning("Blueprint " + fileName + " had no bedrock block in it so one was added automatically in the center. You should check it."); } return bp; } @@ -165,7 +188,7 @@ public boolean save(User user, String newName, String displayName) } /** - * Save a blueprint + * Save a blueprint as a plain JSON file * @param blueprint - blueprint * @return true if successful, false if not */ @@ -174,18 +197,12 @@ public boolean saveBlueprint(Blueprint blueprint) { plugin.logError("Blueprint name was empty - could not save it"); return false; } - File file = new File(blueprintFolder, blueprint.getName()); + File file = new File(blueprintFolder, blueprint.getName() + BlueprintsManager.BLUEPRINT_SUFFIX); String toStore = gson.toJson(blueprint, Blueprint.class); try (FileWriter fileWriter = new FileWriter(file, StandardCharsets.UTF_8)) { fileWriter.write(toStore); } catch (IOException e) { - plugin.logError("Could not save temporary blueprint file: " + file.getName()); - return false; - } - try { - zip(file); - } catch (IOException e) { - plugin.logError("Could not zip temporary blueprint file: " + file.getName()); + plugin.logError("Could not save blueprint file: " + file.getName()); return false; } return true; @@ -232,23 +249,4 @@ private void unzipFiles(final ZipInputStream zipInputStream, final Path unzipFil } } - private void zip(File targetFile) throws IOException { - try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(targetFile.getCanonicalPath() + BlueprintsManager.BLUEPRINT_SUFFIX))) { - zipOutputStream.putNextEntry(new ZipEntry(targetFile.getName())); - try (FileInputStream inputStream = new FileInputStream(targetFile)) { - final byte[] buffer = new byte[1024]; - int length = inputStream.read(buffer); - while (length >= 0) { - zipOutputStream.write(buffer, 0, length); - length = inputStream.read(buffer); - } - } - try { - Files.delete(targetFile.toPath()); - } catch (Exception e) { - plugin.logError(e.getMessage()); - } - } - } - } diff --git a/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java b/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java index 0faca3490..edcef96c4 100644 --- a/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java @@ -61,7 +61,12 @@ public class BlueprintsManager { private static final String BLUEPRINT_BUNDLE_SUFFIX = ".json"; - public static final String BLUEPRINT_SUFFIX = ".blu"; + public static final String BLUEPRINT_SUFFIX = ".blueprint"; + /** + * Legacy blueprint suffix for backward compatibility with zipped .blu files. + * @since 3.2.0 + */ + public static final String LEGACY_BLUEPRINT_SUFFIX = ".blu"; public static final String DEFAULT_BUNDLE_NAME = "default"; @NonNull public static final String FOLDER_NAME = "blueprints"; @@ -142,6 +147,7 @@ public void extractDefaultBlueprints(@NonNull GameModeAddon addon) { try (JarFile jar = new JarFile(addon.getFile())) { Util.listJarFiles(jar, FOLDER_NAME, BLUEPRINT_BUNDLE_SUFFIX).forEach(name -> addon.saveResource(name, false)); Util.listJarFiles(jar, FOLDER_NAME, BLUEPRINT_SUFFIX).forEach(name -> addon.saveResource(name, false)); + Util.listJarFiles(jar, FOLDER_NAME, LEGACY_BLUEPRINT_SUFFIX).forEach(name -> addon.saveResource(name, false)); } catch (IOException e) { plugin.logError("Could not load blueprint files from addon jar " + e.getMessage()); } @@ -317,17 +323,27 @@ public void loadBlueprints(@NonNull GameModeAddon addon) { plugin.logError("There is no blueprint folder for addon " + addon.getDescription().getName()); bpf.mkdirs(); } - File[] bps = bpf.listFiles((dir, name) -> name.endsWith(BLUEPRINT_SUFFIX)); + // Collect blueprint names from both new (.blueprint) and legacy (.blu) files. + // If both formats exist for the same name, the new format takes precedence. + Set blueprintNames = new HashSet<>(); + File[] newBps = bpf.listFiles((dir, name) -> name.endsWith(BLUEPRINT_SUFFIX)); + if (newBps != null) { + for (File file : newBps) { + blueprintNames.add(Util.sanitizeInput(file.getName().substring(0, file.getName().length() - BLUEPRINT_SUFFIX.length()))); + } + } + File[] legacyBps = bpf.listFiles((dir, name) -> name.endsWith(LEGACY_BLUEPRINT_SUFFIX)); + if (legacyBps != null) { + for (File file : legacyBps) { + blueprintNames.add(Util.sanitizeInput(file.getName().substring(0, file.getName().length() - LEGACY_BLUEPRINT_SUFFIX.length()))); + } + } - if (bps == null || bps.length == 0) { + if (blueprintNames.isEmpty()) { plugin.logError("No blueprints found for " + addon.getDescription().getName()); return; } - for (File file : bps) { - - // Input sanitization is required for weirdos that edit files manually. - String fileName = Util.sanitizeInput(file.getName().substring(0, file.getName().length() - BLUEPRINT_SUFFIX.length())); - + for (String fileName : blueprintNames) { try { Blueprint bp = new BlueprintClipboardManager(plugin, bpf).loadBlueprint(fileName); bp.setName(fileName); @@ -426,12 +442,14 @@ public void deleteBlueprint(GameModeAddon addon, String name) { it.remove(); - File file = new File(this.getBlueprintsFolder(addon), b.getName() + BLUEPRINT_SUFFIX); + File newFile = new File(this.getBlueprintsFolder(addon), b.getName() + BLUEPRINT_SUFFIX); + File legacyFile = new File(this.getBlueprintsFolder(addon), b.getName() + LEGACY_BLUEPRINT_SUFFIX); - // Delete the file + // Delete both new and legacy format files try { - Files.deleteIfExists(file.toPath()); + Files.deleteIfExists(newFile.toPath()); + Files.deleteIfExists(legacyFile.toPath()); } catch (IOException e) { @@ -479,7 +497,7 @@ public boolean paste(GameModeAddon addon, Island island, String name, Runnable t bp = getBlueprints(addon).get("island"); plugin.logError("Blueprint bundle has no normal world blueprint, using default"); if (bp == null) { - plugin.logError("NO DEFAULT BLUEPRINT FOUND! Make sure 'island.blu' exists!"); + plugin.logError("NO DEFAULT BLUEPRINT FOUND! Make sure 'island.blueprint' exists!"); } } // Paste @@ -646,13 +664,14 @@ public void renameBlueprint(GameModeAddon addon, Blueprint bp, String name, Stri } File bpf = this.getBlueprintsFolder(addon); - // Get the filename - File fileName = new File(bpf, bp.getName() + BLUEPRINT_SUFFIX); - // Delete the old file + // Delete old files in both new and legacy formats + File newFile = new File(bpf, bp.getName() + BLUEPRINT_SUFFIX); + File legacyFile = new File(bpf, bp.getName() + LEGACY_BLUEPRINT_SUFFIX); try { - Files.deleteIfExists(fileName.toPath()); + Files.deleteIfExists(newFile.toPath()); + Files.deleteIfExists(legacyFile.toPath()); } catch (IOException e) { diff --git a/src/test/java/world/bentobox/bentobox/managers/BlueprintClipboardManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/BlueprintClipboardManagerTest.java index 4c60af20c..1544f6153 100644 --- a/src/test/java/world/bentobox/bentobox/managers/BlueprintClipboardManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/BlueprintClipboardManagerTest.java @@ -94,7 +94,7 @@ class BlueprintClipboardManagerTest extends CommonTestSetup { }"""; private void zip(File targetFile) throws IOException { - try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(targetFile.getAbsolutePath() + BlueprintsManager.BLUEPRINT_SUFFIX))) { + try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(targetFile.getAbsolutePath() + BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX))) { zipOutputStream.putNextEntry(new ZipEntry(targetFile.getName())); try (FileInputStream inputStream = new FileInputStream(targetFile)) { final byte[] buffer = new byte[1024]; @@ -191,7 +191,7 @@ void testLoadBlueprintNoSuchFile() { } catch (Exception e) { assertTrue(e instanceof IOException); } finally { - verify(plugin).logError("Could not load blueprint file - does not exist : test.blu"); + verify(plugin).logError("Could not load blueprint file - does not exist : test.blueprint"); } } @@ -201,7 +201,7 @@ void testLoadBlueprintNoSuchFile() { @Test void testLoadBlueprintNoFileInZip() throws IOException { blueprintFolder.mkdirs(); - // Make a blueprint file + // Make a blueprint file that is not a valid zip (legacy .blu file) YamlConfiguration config = new YamlConfiguration(); config.set("hello", "this is a test"); File configFile = new File(blueprintFolder, "blueprint.blu"); @@ -219,6 +219,29 @@ void testLoadBlueprintNoFileInZip() throws IOException { /** * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}. + * Tests loading a .blueprint file with invalid JSON content. + */ + @Test + void testLoadBlueprintFileJsonError() throws IOException { + blueprintFolder.mkdirs(); + // Make a blueprint file with invalid JSON content + YamlConfiguration config = new YamlConfiguration(); + config.set("hello", "this is a test"); + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); + config.save(configFile); + BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); + try { + bcm.loadBlueprint(BLUEPRINT); + } catch (Exception e) { + assertTrue(e instanceof IOException); + } finally { + verify(plugin).logError("Blueprint has JSON error: blueprint.blueprint"); + } + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}. + * Tests loading a legacy .blu file with invalid JSON content inside the zip. */ @Test void testLoadBlueprintFileInZipJSONError() throws IOException { @@ -242,6 +265,26 @@ void testLoadBlueprintFileInZipJSONError() throws IOException { /** * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}. + * Tests loading a .blueprint file with no bedrock. + */ + @Test + void testLoadBlueprintFileNoBedrock() throws IOException { + blueprintFolder.mkdirs(); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); + Files.writeString(configFile.toPath(), jsonNoBedrock, StandardOpenOption.CREATE); + BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); + Blueprint bp = bcm.loadBlueprint(BLUEPRINT); + verify(plugin).logWarning("Blueprint blueprint.blueprint had no bedrock block in it so one was added automatically in the center. You should check it."); + // Verify bedrock was placed in the center of the blueprint + assertEquals(5, bp.getBedrock().getBlockX()); + assertEquals(5, bp.getBedrock().getBlockY()); + assertEquals(5, bp.getBedrock().getBlockZ()); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}. + * Tests loading a legacy .blu file with no bedrock. */ @Test void testLoadBlueprintFileInZipNoBedrock() throws IOException { @@ -262,6 +305,27 @@ void testLoadBlueprintFileInZipNoBedrock() throws IOException { /** * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}. + * Tests loading a .blueprint (plain JSON) file. + */ + @Test + void testLoadBlueprintFile() throws IOException { + blueprintFolder.mkdirs(); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); + Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE); + BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); + Blueprint bp = bcm.loadBlueprint(BLUEPRINT); + assertEquals(-2, bp.getBedrock().getBlockX()); + assertEquals(-16, bp.getBedrock().getBlockY()); + assertEquals(-1, bp.getBedrock().getBlockZ()); + assertTrue(bp.getAttached().isEmpty()); + assertTrue(bp.getEntities().isEmpty()); + assertEquals(2, bp.getBlocks().size()); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}. + * Tests loading a legacy .blu (zipped) file. */ @Test void testLoadBlueprintFileInZip() throws IOException { @@ -281,17 +345,36 @@ void testLoadBlueprintFileInZip() throws IOException { assertEquals(2, bp.getBlocks().size()); } + /** + * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}. + * Tests that the new .blueprint format takes precedence over legacy .blu when both exist. + */ + @Test + void testLoadBlueprintPrefersNewFormatOverLegacy() throws IOException { + blueprintFolder.mkdirs(); + // Create a new format .blueprint file + File jsonFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); + Files.writeString(jsonFile.toPath(), json, StandardOpenOption.CREATE); + // Also create a legacy .blu file (should be ignored) + File legacyFile = new File(blueprintFolder, BLUEPRINT); + Files.writeString(legacyFile.toPath(), json, StandardOpenOption.CREATE); + zip(legacyFile); + BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); + Blueprint bp = bcm.loadBlueprint(BLUEPRINT); + assertEquals(-2, bp.getBedrock().getBlockX()); + // Verify the plain JSON file still exists (not deleted like the temp zip file would be) + assertTrue(jsonFile.exists()); + } + /** * Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#load(java.lang.String)}. */ @Test void testLoadString() throws IOException { blueprintFolder.mkdirs(); - // Make a blueprint file - File configFile = new File(blueprintFolder, BLUEPRINT); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE); - // Zip it - zip(configFile); BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); bcm.load(BLUEPRINT); Blueprint bp = bcm.getClipboard().getBlueprint(); @@ -309,11 +392,9 @@ void testLoadString() throws IOException { @Test void testLoadUserString() throws IOException { blueprintFolder.mkdirs(); - // Make a blueprint file - File configFile = new File(blueprintFolder, BLUEPRINT); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE); - // Zip it - zip(configFile); BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); User user = mock(User.class); assertTrue(bcm.load(user, BLUEPRINT)); @@ -329,7 +410,7 @@ void testLoadUserStringFail() { User user = mock(User.class); assertFalse(bcm.load(user, BLUEPRINT)); verify(user).sendMessage("commands.admin.blueprint.could-not-load"); - verify(plugin).logError("Could not load blueprint file - does not exist : blueprint.blu"); + verify(plugin).logError("Could not load blueprint file - does not exist : blueprint.blueprint"); } /** @@ -339,16 +420,14 @@ void testLoadUserStringFail() { void testSave() throws IOException { // Load a blueprint, then save it blueprintFolder.mkdirs(); - // Make a blueprint file - File configFile = new File(blueprintFolder, BLUEPRINT); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE); - // Zip it - zip(configFile); BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); bcm.load(BLUEPRINT); User user = mock(User.class); assertTrue(bcm.save(user, "test1234", "")); - File bp = new File(blueprintFolder, "test1234.blu"); + File bp = new File(blueprintFolder, "test1234.blueprint"); assertTrue(bp.exists()); verify(user).sendMessage("general.success"); } @@ -360,16 +439,14 @@ void testSave() throws IOException { void testSaveBadChars() throws IOException { // Load a blueprint, then save it blueprintFolder.mkdirs(); - // Make a blueprint file - File configFile = new File(blueprintFolder, BLUEPRINT); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE); - // Zip it - zip(configFile); BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); bcm.load(BLUEPRINT); User user = mock(User.class); assertTrue(bcm.save(user, Util.sanitizeInput("test.1234/../../film"), "")); - File bp = new File(blueprintFolder, "test.1234_.._.._film.blu"); + File bp = new File(blueprintFolder, "test.1234_.._.._film.blueprint"); assertTrue(bp.exists()); verify(user).sendMessage("general.success"); } @@ -381,16 +458,14 @@ void testSaveBadChars() throws IOException { void testSaveForeignChars() throws IOException { // Load a blueprint, then save it blueprintFolder.mkdirs(); - // Make a blueprint file - File configFile = new File(blueprintFolder, BLUEPRINT); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE); - // Zip it - zip(configFile); BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); bcm.load(BLUEPRINT); User user = mock(User.class); assertTrue(bcm.save(user, "日本語の言葉", "")); - File bp = new File(blueprintFolder, "日本語の言葉.blu"); + File bp = new File(blueprintFolder, "日本語の言葉.blueprint"); assertTrue(bp.exists()); verify(user).sendMessage("general.success"); } @@ -402,17 +477,15 @@ void testSaveForeignChars() throws IOException { void testSaveForeignBadChars() throws IOException { // Load a blueprint, then save it blueprintFolder.mkdirs(); - // Make a blueprint file - File configFile = new File(blueprintFolder, BLUEPRINT); + // Make a plain JSON blueprint file + File configFile = new File(blueprintFolder, BLUEPRINT + BlueprintsManager.BLUEPRINT_SUFFIX); Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE); - // Zip it - zip(configFile); BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder); bcm.load(BLUEPRINT); User user = mock(User.class); assertTrue(bcm.save(user, Util.sanitizeInput("日本語の言葉/../../../config"), "")); - File bp = new File(blueprintFolder, "日本語の言葉_.._.._.._config.blu"); + File bp = new File(blueprintFolder, "日本語の言葉_.._.._.._config.blueprint"); assertTrue(bp.exists()); verify(user).sendMessage("general.success"); } @@ -438,7 +511,7 @@ void testSaveBlueprintSuccess() { Blueprint blueprint = new Blueprint(); blueprint.setName("test123"); assertTrue(bcm.saveBlueprint(blueprint)); - File bp = new File(blueprintFolder, "test123.blu"); + File bp = new File(blueprintFolder, "test123.blueprint"); assertTrue(bp.exists()); } diff --git a/src/test/java/world/bentobox/bentobox/managers/BlueprintsManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/BlueprintsManagerTest.java index e637347ab..895619278 100644 --- a/src/test/java/world/bentobox/bentobox/managers/BlueprintsManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/BlueprintsManagerTest.java @@ -116,12 +116,12 @@ private void deleteFolder(File folder) throws IOException { } /** - * Zips {@code sourceFile} into {@code /.blu}, then - * deletes the original file. Mirrors what BlueprintClipboardManager does. + * Zips {@code sourceFile} into {@code /.blu} (legacy format), then + * deletes the original file. Mirrors what the old BlueprintClipboardManager used to do. */ private void zipBlueprint(File sourceFile, String entryName) throws IOException { File zipFile = new File(sourceFile.getParentFile(), - entryName + BlueprintsManager.BLUEPRINT_SUFFIX); + entryName + BlueprintsManager.LEGACY_BLUEPRINT_SUFFIX); try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile)); FileInputStream fis = new FileInputStream(sourceFile)) { zos.putNextEntry(new ZipEntry(sourceFile.getName())); @@ -446,7 +446,22 @@ void testLoadBlueprintsEmptyFolder() { @Test void testLoadBlueprintsLoadsFile() throws IOException { blueprintsFolder.mkdirs(); - // Write the raw JSON, then zip it into "island.blu" + // Write the raw JSON as a plain .blueprint file + File jsonFile = new File(blueprintsFolder, "island" + BlueprintsManager.BLUEPRINT_SUFFIX); + Files.writeString(jsonFile.toPath(), BLUEPRINT_JSON); + + manager.loadBlueprints(addon); + + Map blueprints = manager.getBlueprints(addon); + assertEquals(1, blueprints.size()); + assertTrue(blueprints.containsKey("island")); + verify(plugin).log("Loaded blueprint 'island' for TestAddon"); + } + + @Test + void testLoadBlueprintsLoadsLegacyBluFile() throws IOException { + blueprintsFolder.mkdirs(); + // Write the raw JSON, then zip it into "island.blu" (legacy format) File jsonFile = new File(blueprintsFolder, "island"); Files.writeString(jsonFile.toPath(), BLUEPRINT_JSON); zipBlueprint(jsonFile, "island"); @@ -550,7 +565,7 @@ void testRenameBlueprintSameNameIsNoOp() { @Test void testRenameBlueprintNewName() throws IOException { blueprintsFolder.mkdirs(); - // Create the "old" .blu file so deleteIfExists has something to remove. + // Create the "old" .blueprint file so deleteIfExists has something to remove. File oldFile = new File(blueprintsFolder, "island" + BlueprintsManager.BLUEPRINT_SUFFIX); Files.writeString(oldFile.toPath(), "dummy"); From 2425bfab4b799786b2b33c09b7bb02c81f5be5bf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:20:48 +0000 Subject: [PATCH 61/95] Initial plan From 183a218116bebda33ea1416a53dc5180eb9c326e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:23:02 +0000 Subject: [PATCH 62/95] Add filename length validation for blueprint file scanning Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/64819466-6133-4499-98b9-2d03490ea00e Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../world/bentobox/bentobox/managers/BlueprintsManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java b/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java index edcef96c4..f9e398f98 100644 --- a/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/BlueprintsManager.java @@ -326,13 +326,13 @@ public void loadBlueprints(@NonNull GameModeAddon addon) { // Collect blueprint names from both new (.blueprint) and legacy (.blu) files. // If both formats exist for the same name, the new format takes precedence. Set blueprintNames = new HashSet<>(); - File[] newBps = bpf.listFiles((dir, name) -> name.endsWith(BLUEPRINT_SUFFIX)); + File[] newBps = bpf.listFiles((dir, name) -> name.endsWith(BLUEPRINT_SUFFIX) && name.length() > BLUEPRINT_SUFFIX.length()); if (newBps != null) { for (File file : newBps) { blueprintNames.add(Util.sanitizeInput(file.getName().substring(0, file.getName().length() - BLUEPRINT_SUFFIX.length()))); } } - File[] legacyBps = bpf.listFiles((dir, name) -> name.endsWith(LEGACY_BLUEPRINT_SUFFIX)); + File[] legacyBps = bpf.listFiles((dir, name) -> name.endsWith(LEGACY_BLUEPRINT_SUFFIX) && name.length() > LEGACY_BLUEPRINT_SUFFIX.length()); if (legacyBps != null) { for (File file : legacyBps) { blueprintNames.add(Util.sanitizeInput(file.getName().substring(0, file.getName().length() - LEGACY_BLUEPRINT_SUFFIX.length()))); From d0f31809d2f12ef6209c43a991662e6426d3825c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 23:22:38 +0000 Subject: [PATCH 63/95] Add Island Defaults tab to Admin Settings GUI for editing default protection flags Creates a new tab in the Admin Settings panel (opened with /admin settings) that allows admins to change the default protection flag rank values that new islands will receive. New classes: - IslandDefaultCycleClick: Click handler that cycles default island protection flag ranks and saves to world settings - IslandDefaultSettingsTab: Tab showing protection flags with their default rank values for new islands Changes: - AdminSettingsCommand: Added tab 3 with IslandDefaultSettingsTab - TestWorldSettings: Added mutable defaultIslandFlagNames map - en-US.yml: Added ISLAND_DEFAULTS locale strings Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/aab884c0-0f55-4fa7-bc57-6d52f03a5992 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../commands/admin/AdminSettingsCommand.java | 2 + .../IslandDefaultCycleClick.java | 93 ++++++++++ .../settings/IslandDefaultSettingsTab.java | 112 ++++++++++++ src/main/resources/locales/en-US.yml | 5 + .../bentobox/bentobox/TestWorldSettings.java | 6 + .../IslandDefaultCycleClickTest.java | 161 ++++++++++++++++++ .../IslandDefaultSettingsTabTest.java | 85 +++++++++ 7 files changed, 464 insertions(+) create mode 100644 src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java create mode 100644 src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java create mode 100644 src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClickTest.java create mode 100644 src/test/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTabTest.java diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSettingsCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSettingsCommand.java index 10e1d296b..2d689c39c 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSettingsCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSettingsCommand.java @@ -21,6 +21,7 @@ import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.RanksManager; +import world.bentobox.bentobox.panels.settings.IslandDefaultSettingsTab; import world.bentobox.bentobox.panels.settings.SettingsTab; import world.bentobox.bentobox.panels.settings.WorldDefaultSettingsTab; import world.bentobox.bentobox.util.Util; @@ -224,6 +225,7 @@ public boolean execute(User user, String label, List args) { .world(getWorld()) .tab(1, new SettingsTab(getWorld(), user, Flag.Type.WORLD_SETTING, Flag.Mode.EXPERT)) .tab(2, new WorldDefaultSettingsTab(getWorld(), user)) + .tab(3, new IslandDefaultSettingsTab(getWorld(), user)) .startingSlot(1) .size(54) .build().openPanel(); diff --git a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java new file mode 100644 index 000000000..db93e269d --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java @@ -0,0 +1,93 @@ +package world.bentobox.bentobox.api.flags.clicklisteners; + +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.event.inventory.ClickType; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.panels.Panel; +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.managers.RanksManager; +import world.bentobox.bentobox.util.Util; + +/** + * Left-clicks increase the default island protection rank, right-clicks decrease it. + * This modifies the default rank that new islands will receive for a protection flag. + * @author tastybento + * @since 3.2.0 + */ +public class IslandDefaultCycleClick implements PanelItem.ClickHandler { + + private final BentoBox plugin = BentoBox.getInstance(); + private final String id; + private int minRank = RanksManager.VISITOR_RANK; + private int maxRank = RanksManager.OWNER_RANK; + + /** + * Construct default cycle clicker with min rank of {@link RanksManager#VISITOR_RANK} + * and max rank of {@link RanksManager#OWNER_RANK} + * @param id - the flag id that will be adjusted by this click + */ + public IslandDefaultCycleClick(String id) { + this.id = id; + } + + /** + * Construct a cycle clicker with a min and max rank + * @param id flag id + * @param minRank minimum rank value + * @param maxRank maximum rank value + */ + public IslandDefaultCycleClick(String id, int minRank, int maxRank) { + this.id = id; + this.minRank = minRank; + this.maxRank = maxRank; + } + + @Override + public boolean onClick(Panel panel, User user, ClickType click, int slot) { + if (panel.getWorld().isEmpty()) { + plugin.logError("Panel " + panel.getName() + + " has no world associated with it. Please report this bug to the author."); + return true; + } + World world = panel.getWorld().get(); + // Permission check + String reqPerm = plugin.getIWM().getPermissionPrefix(world) + "admin.set-world-defaults"; + if (!user.hasPermission(reqPerm) && !user.isOp()) { + user.sendMessage("general.errors.no-permission", TextVariables.PERMISSION, reqPerm); + user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_METAL_HIT, 1F, 1F); + return true; + } + // Get flag + plugin.getFlagsManager().getFlag(id).ifPresent(flag -> { + // Get current default rank from world settings + int currentRank = plugin.getIWM().getWorldSettings(world) + .getDefaultIslandFlagNames().getOrDefault(id, flag.getDefaultRank()); + + int newRank; + if (click.equals(ClickType.LEFT)) { + newRank = currentRank >= maxRank ? minRank + : RanksManager.getInstance().getRankUpValue(currentRank); + user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_OFF, 1F, 1F); + } else if (click.equals(ClickType.RIGHT)) { + newRank = currentRank <= minRank ? maxRank + : RanksManager.getInstance().getRankDownValue(currentRank); + user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F); + } else { + return; + } + + // Update default island flag rank in world settings + plugin.getIWM().getWorldSettings(world).getDefaultIslandFlagNames().put(id, newRank); + + // Save world settings + plugin.getIWM().getAddon(Util.getWorld(world)).ifPresent(GameModeAddon::saveWorldSettings); + }); + return true; + } + +} diff --git a/src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java b/src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java new file mode 100644 index 000000000..0f1e44bbf --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java @@ -0,0 +1,112 @@ +package world.bentobox.bentobox.panels.settings; + +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.World; +import org.eclipse.jdt.annotation.NonNull; + +import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.bentobox.api.flags.Flag.Type; +import world.bentobox.bentobox.api.flags.clicklisteners.IslandDefaultCycleClick; +import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.Tab; +import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.managers.RanksManager; + +/** + * Implements a {@link Tab} that enables the default island protection settings to be changed. + * These are the protection flag rank values that new islands will receive. + * @author tastybento + * @since 3.2.0 + */ +public class IslandDefaultSettingsTab extends SettingsTab implements Tab { + + /** + * @param world - world + * @param user - user + */ + public IslandDefaultSettingsTab(World world, User user) { + super(world, user, Type.PROTECTION); + } + + /** + * Get the icon for this tab + * @return panel item + */ + @Override + public PanelItem getIcon() { + PanelItemBuilder pib = new PanelItemBuilder(); + pib.icon(Material.CRACKED_STONE_BRICKS); + pib.name(getName()); + pib.description(user.getTranslation(PROTECTION_PANEL + "ISLAND_DEFAULTS.description")); + return pib.build(); + } + + @Override + public String getName() { + return user.getTranslation(PROTECTION_PANEL + "ISLAND_DEFAULTS.title", "[world_name]", + plugin.getIWM().getFriendlyName(world)); + } + + @Override + public String getPermission() { + return plugin.getIWM().getPermissionPrefix(world) + "admin.set-world-defaults"; + } + + /** + * Get all the flags as panel items + * @return list of all the panel items for this flag type + */ + @Override + public @NonNull List getPanelItems() { + return getFlags().stream().map(f -> { + PanelItem i = f.toPanelItem(plugin, user, world, island, false); + // Replace the click handler with IslandDefaultCycleClick + i.setClickHandler(new IslandDefaultCycleClick(f.getID())); + // Replace the description to show the default rank for new islands + int defaultRank = plugin.getIWM().getWorldSettings(world) + .getDefaultIslandFlagNames().getOrDefault(f.getID(), f.getDefaultRank()); + // Build the description showing ranks like the normal protection flag display + i.setDescription(buildRankDescription(f, defaultRank)); + return i; + }).toList(); + } + + /** + * Build the description showing which ranks are allowed/blocked based on the default rank. + * This mirrors the layout of {@link Flag#createProtectionFlag}. + */ + private List buildRankDescription(Flag flag, int defaultRank) { + List desc = new java.util.ArrayList<>(); + desc.add(user.getTranslation("protection.panel.flag-item.description-layout", + TextVariables.DESCRIPTION, user.getTranslation(flag.getDescriptionReference()))); + + RanksManager.getInstance().getRanks().forEach((reference, score) -> { + String rankName = user.getTranslation(reference); + if (score > RanksManager.BANNED_RANK && score < defaultRank) { + desc.add(getRankTranslation("protection.panel.flag-item.blocked-rank", rankName)); + } else if (score <= RanksManager.OWNER_RANK && score > defaultRank) { + desc.add(getRankTranslation("protection.panel.flag-item.allowed-rank", rankName)); + } else if (score == defaultRank) { + desc.add(getRankTranslation("protection.panel.flag-item.minimal-rank", rankName)); + } + }); + return desc; + } + + /** + * Gets a rank translation, supporting both MiniMessage format (with [rank] placeholder) + * and legacy format (without placeholder, rank name concatenated at end). + */ + private String getRankTranslation(String key, String rankName) { + String translation = user.getTranslation(key, TextVariables.RANK, rankName); + if (!translation.contains(rankName)) { + translation = user.getTranslation(key) + rankName; + } + return translation; + } + +} diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 58704c83e..d45e50b2f 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -1791,6 +1791,11 @@ protection: description: | Protection settings when player is outside their [prefix_island] + ISLAND_DEFAULTS: + title: '[world_name] Island Defaults' + description: | + Default protection settings + for new [prefix_island]s flag-item: name-layout: '[name]' # Add commands to this list as required diff --git a/src/test/java/world/bentobox/bentobox/TestWorldSettings.java b/src/test/java/world/bentobox/bentobox/TestWorldSettings.java index a91d1c709..4ca7eaecf 100644 --- a/src/test/java/world/bentobox/bentobox/TestWorldSettings.java +++ b/src/test/java/world/bentobox/bentobox/TestWorldSettings.java @@ -22,6 +22,7 @@ public class TestWorldSettings implements WorldSettings { private long epoch; private final Map worldFlags = new java.util.HashMap<>(); + private final Map defaultIslandFlagNames = new java.util.HashMap<>(); @Override public GameMode getDefaultGameMode() { @@ -41,6 +42,11 @@ public Map getDefaultIslandSettings() { return Collections.emptyMap(); } + @Override + public Map getDefaultIslandFlagNames() { + return defaultIslandFlagNames; + } + @Override public Difficulty getDifficulty() { diff --git a/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClickTest.java b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClickTest.java new file mode 100644 index 000000000..94bf06f1f --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClickTest.java @@ -0,0 +1,161 @@ +package world.bentobox.bentobox.api.flags.clicklisteners; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Optional; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.Inventory; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Mockito; + +import world.bentobox.bentobox.RanksManagerTestSetup; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.bentobox.api.panels.Panel; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.managers.FlagsManager; +import world.bentobox.bentobox.managers.RanksManager; +import world.bentobox.bentobox.util.Util; + +/** + * @author tastybento + */ +class IslandDefaultCycleClickTest extends RanksManagerTestSetup { + + private IslandDefaultCycleClick listener; + @Mock + private Panel panel; + @Mock + private User user; + private Flag flag; + @Mock + private GameModeAddon addon; + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); + // Island World Manager + when(iwm.inWorld(any(World.class))).thenReturn(true); + when(iwm.inWorld(any(Location.class))).thenReturn(true); + when(iwm.getPermissionPrefix(any())).thenReturn("bskyblock."); + Optional optionalAddon = Optional.of(addon); + when(iwm.getAddon(Mockito.any())).thenReturn(optionalAddon); + + listener = new IslandDefaultCycleClick("test"); + + // Panel + when(panel.getInventory()).thenReturn(mock(Inventory.class)); + when(panel.getWorld()).thenReturn(Optional.of(world)); + + // User + when(user.getWorld()).thenReturn(world); + when(user.getLocation()).thenReturn(mock(Location.class)); + when(user.getPlayer()).thenReturn(mock(Player.class)); + when(user.isOp()).thenReturn(false); + + // Util + mockedUtil.when(() -> Util.getWorld(any())).thenReturn(world); + + // Flags Manager + FlagsManager flagsMgr = mock(FlagsManager.class); + flag = mock(Flag.class); + when(flag.getDefaultRank()).thenReturn(RanksManager.MEMBER_RANK); + when(flag.getID()).thenReturn("test"); + + when(flagsMgr.getFlag(Mockito.anyString())).thenReturn(Optional.of(flag)); + when(plugin.getFlagsManager()).thenReturn(flagsMgr); + + // RanksManager + mockedRanksManager.when(RanksManager::getInstance).thenReturn(rm); + when(rm.getRankUpValue(RanksManager.MEMBER_RANK)).thenReturn(RanksManager.OWNER_RANK); + when(rm.getRankDownValue(RanksManager.MEMBER_RANK)).thenReturn(RanksManager.TRUSTED_RANK); + } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } + + /** + * Test for {@link IslandDefaultCycleClick#onClick(Panel, User, ClickType, int)} + */ + @Test + void testOnClickNoPermission() { + when(user.hasPermission(anyString())).thenReturn(false); + when(user.isOp()).thenReturn(false); + listener.onClick(panel, user, ClickType.LEFT, 0); + verify(user).sendMessage("general.errors.no-permission", "[permission]", "bskyblock.admin.set-world-defaults"); + verify(addon, never()).saveWorldSettings(); + } + + /** + * Test for {@link IslandDefaultCycleClick#onClick(Panel, User, ClickType, int)} + */ + @Test + void testOnClickLeftClick() { + when(user.hasPermission(anyString())).thenReturn(true); + listener.onClick(panel, user, ClickType.LEFT, 0); + // Should save world settings + verify(addon).saveWorldSettings(); + } + + /** + * Test for {@link IslandDefaultCycleClick#onClick(Panel, User, ClickType, int)} + */ + @Test + void testOnClickRightClick() { + when(user.hasPermission(anyString())).thenReturn(true); + listener.onClick(panel, user, ClickType.RIGHT, 0); + // Should save world settings + verify(addon).saveWorldSettings(); + } + + /** + * Test for {@link IslandDefaultCycleClick#onClick(Panel, User, ClickType, int)} + */ + @Test + void testOnClickOpPermission() { + when(user.hasPermission(anyString())).thenReturn(false); + when(user.isOp()).thenReturn(true); + listener.onClick(panel, user, ClickType.LEFT, 0); + // Op should be allowed, so save world settings + verify(addon).saveWorldSettings(); + } + + /** + * Test for {@link IslandDefaultCycleClick#onClick(Panel, User, ClickType, int)} + */ + @Test + void testOnClickNoPanelWorld() { + when(panel.getWorld()).thenReturn(Optional.empty()); + // Should not throw, just return true + assertTrue(listener.onClick(panel, user, ClickType.LEFT, 0)); + verify(addon, never()).saveWorldSettings(); + } + + /** + * Test for {@link IslandDefaultCycleClick#onClick(Panel, User, ClickType, int)} with middle click + */ + @Test + void testOnClickMiddleClick() { + when(user.hasPermission(anyString())).thenReturn(true); + listener.onClick(panel, user, ClickType.MIDDLE, 0); + // Middle click should not trigger any save + verify(addon, never()).saveWorldSettings(); + } +} diff --git a/src/test/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTabTest.java b/src/test/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTabTest.java new file mode 100644 index 000000000..142d218bf --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTabTest.java @@ -0,0 +1,85 @@ +package world.bentobox.bentobox.panels.settings; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.List; + +import org.bukkit.Material; +import org.eclipse.jdt.annotation.NonNull; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +import world.bentobox.bentobox.CommonTestSetup; +import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.bentobox.api.flags.Flag.Mode; +import world.bentobox.bentobox.api.flags.Flag.Type; +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.TabbedPanel; +import world.bentobox.bentobox.api.user.User; + +class IslandDefaultSettingsTabTest extends CommonTestSetup { + + private IslandDefaultSettingsTab tab; + private User user; + @Mock + private TabbedPanel parent; + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); + when(plugin.getFlagsManager()).thenReturn(fm); + when(parent.getIsland()).thenReturn(island); + when(iwm.getPermissionPrefix(world)).thenReturn("bskyblock."); + + user = User.getInstance(mockPlayer); + tab = new IslandDefaultSettingsTab(world, user); + } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } + + @Test + void testGetIcon() { + PanelItem icon = tab.getIcon(); + assertNotNull(icon); + assertEquals(Material.CRACKED_STONE_BRICKS, icon.getItem().getType()); + } + + @Test + void testGetName() { + assertEquals("protection.panel.ISLAND_DEFAULTS.title", tab.getName()); + } + + @Test + void testGetPermission() { + assertEquals("bskyblock.admin.set-world-defaults", tab.getPermission()); + } + + @Test + void testGetPanelItems() { + @NonNull + List items = tab.getPanelItems(); + assertTrue(items.isEmpty()); + } + + @Test + void testGetPanelItemsWithFlags() { + // Set up a visible PROTECTION flag + Flag testFlag = new Flag.Builder("TEST_FLAG", Material.STONE) + .type(Type.PROTECTION).mode(Mode.BASIC).build(); + when(fm.getFlags()).thenReturn(List.of(testFlag)); + @NonNull + List items = tab.getPanelItems(); + assertFalse(items.isEmpty()); + } +} From f361f4a0a947ebf4bc5a707f6e98f95952c748ff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:17:29 +0000 Subject: [PATCH 64/95] Initial plan From 25cc6586708c54d64b4d69b5a222b9f5e7bd9c7f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:28:15 +0000 Subject: [PATCH 65/95] Add flag state placeholders for game mode addons Register placeholders for each flag (protection, setting, world setting) so users can query flag states via PlaceholderAPI. For example: - %bskyblock_flag_pvp_overworld% returns true/false - %bskyblock_flag_break_blocks% returns the minimum allowed rank name - %bskyblock_flag_ender_chest% returns true/false Built-in flags get placeholders when registerDefaultPlaceholders() runs. Addon-defined flags get placeholders dynamically when registered. Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/5b7af0c7-302d-4943-bb55-7383a22040ae Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../bentobox/managers/FlagsManager.java | 17 ++++ .../managers/PlaceholdersManager.java | 83 +++++++++++++++++++ .../managers/PlaceholdersManagerTest.java | 75 +++++++++++++++++ 3 files changed, 175 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/managers/FlagsManager.java b/src/main/java/world/bentobox/bentobox/managers/FlagsManager.java index 267eaf80d..115350e3b 100644 --- a/src/main/java/world/bentobox/bentobox/managers/FlagsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/FlagsManager.java @@ -70,9 +70,26 @@ public boolean registerFlag(@Nullable Addon addon, @NonNull Flag flag) { flags.put(flag, addon); // If there is a listener which is not already registered, register it into Bukkit if the plugin is fully loaded flag.getListener().ifPresent(this::registerListener); + // Register flag placeholder for all active game mode addons + registerFlagPlaceholder(flag); return true; } + /** + * Registers a flag placeholder for all active game mode addons. + * This is called when a new flag is registered to ensure dynamically added + * flags (e.g., from addons) also get placeholders. + * @param flag the flag to register a placeholder for + * @since 3.13.0 + */ + private void registerFlagPlaceholder(@NonNull Flag flag) { + PlaceholdersManager pm = plugin.getPlaceholdersManager(); + if (pm == null || plugin.getAddonsManager() == null) { + return; + } + plugin.getAddonsManager().getGameModeAddons().forEach(gma -> pm.registerFlagPlaceholder(gma, flag)); + } + /** * Register any unregistered listeners. * This helps to make sure each flag listener is correctly loaded. diff --git a/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java b/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java index ff36b066f..79d93485c 100644 --- a/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.Collection; +import java.util.Locale; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -19,6 +20,7 @@ import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.placeholders.PlaceholderReplacer; import world.bentobox.bentobox.api.user.User; @@ -137,6 +139,8 @@ public void registerDefaultPlaceholders(@NonNull GameModeAddon addon) { registerTeamMemberPlaceholders(addon); // Register potential island names and member info registerOwnedIslandPlaceholders(addon); + // Register flag placeholders for all currently registered flags + registerFlagPlaceholders(addon); } private void registerOwnedIslandPlaceholders(@NonNull GameModeAddon addon) { @@ -445,6 +449,85 @@ public void unregisterAll() { getPlaceholderAPIHook().ifPresent(PlaceholderAPIHook::unregisterAll); } + // ------------------------------------------------------------------------- + // Flag placeholders + // ------------------------------------------------------------------------- + + /** + * Registers flag placeholders for all currently registered flags. + *

+ * For each flag, a placeholder named {@code flag_} is registered. + * The value depends on the flag type: + *

    + *
  • {@link Flag.Type#PROTECTION} — returns the translated rank name of the minimum rank allowed
  • + *
  • {@link Flag.Type#SETTING} — returns {@code true} or {@code false}
  • + *
  • {@link Flag.Type#WORLD_SETTING} — returns {@code true} or {@code false}
  • + *
+ * + * @param addon the game mode addon to register flag placeholders for + * @since 3.13.0 + */ + private void registerFlagPlaceholders(@NonNull GameModeAddon addon) { + if (plugin.getFlagsManager() == null) { + return; + } + plugin.getFlagsManager().getFlags().forEach(flag -> registerFlagPlaceholder(addon, flag)); + } + + /** + * Registers a single flag placeholder for a game mode addon. + *

+ * The placeholder name is {@code flag_}. If a placeholder + * with that name is already registered for the addon, this method does nothing. + * + * @param addon the game mode addon + * @param flag the flag to register a placeholder for + * @since 3.13.0 + */ + public void registerFlagPlaceholder(@NonNull GameModeAddon addon, @NonNull Flag flag) { + String placeholderName = "flag_" + flag.getID().toLowerCase(Locale.ENGLISH); + if (isPlaceholder(addon, placeholderName)) { + return; + } + String description = getFlagPlaceholderDescription(flag); + registerPlaceholder(addon, placeholderName, description, user -> resolveFlagValue(addon, user, flag)); + } + + private String getFlagPlaceholderDescription(@NonNull Flag flag) { + return switch (flag.getType()) { + case PROTECTION -> + "Minimum rank required for " + flag.getID() + " on the player's island"; + case SETTING -> + "Whether " + flag.getID() + " is enabled on the player's island (true/false)"; + case WORLD_SETTING -> + "Whether " + flag.getID() + " is enabled in the world (true/false)"; + }; + } + + private String resolveFlagValue(@NonNull GameModeAddon addon, @Nullable User user, @NonNull Flag flag) { + if (flag.getType() == Flag.Type.WORLD_SETTING) { + return String.valueOf(flag.isSetForWorld(addon.getOverWorld())); + } + // SETTING and PROTECTION flags need the island + if (user == null) { + return ""; + } + Island island = plugin.getIslands().getIsland(addon.getOverWorld(), user); + if (island == null) { + return ""; + } + if (flag.getType() == Flag.Type.SETTING) { + return String.valueOf(island.isAllowed(flag)); + } + // PROTECTION flag - return the translated rank name + int rankValue = island.getFlag(flag); + String rankRef = RanksManager.getInstance().getRank(rankValue); + if (rankRef.isEmpty()) { + return ""; + } + return user.getTranslationOrNothing(rankRef); + } + // ------------------------------------------------------------------------- // Internal helpers // ------------------------------------------------------------------------- diff --git a/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java index 973e0a0f6..79b32b859 100644 --- a/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java @@ -12,9 +12,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.List; import java.util.Optional; import java.util.Set; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.eclipse.jdt.annotation.NonNull; import org.junit.jupiter.api.AfterEach; @@ -28,6 +30,7 @@ import world.bentobox.bentobox.api.addons.AddonDescription; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.configuration.WorldSettings; +import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.hooks.Hook; import world.bentobox.bentobox.api.placeholders.PlaceholderReplacer; import world.bentobox.bentobox.hooks.placeholders.PlaceholderAPIHook; @@ -490,4 +493,76 @@ void testIsPlaceholderEnabledAddonNoHookDefaultsTrue() { assertTrue(pm.isPlaceholderEnabled(addon, "addon_ph")); } + + // --------------------------------------------------------------- + // registerFlagPlaceholders tests + // --------------------------------------------------------------- + + @Test + void testRegisterDefaultPlaceholdersWithFlags() { + // Set up FlagsManager with some flags + FlagsManager flagsManager = mock(FlagsManager.class); + Flag protectionFlag = new Flag.Builder("BREAK_BLOCKS", Material.STONE_PICKAXE).build(); + Flag settingFlag = new Flag.Builder("PVP_OVERWORLD", Material.ARROW).type(Flag.Type.SETTING).build(); + Flag worldSettingFlag = new Flag.Builder("ENDER_CHEST", Material.ENDER_CHEST).type(Flag.Type.WORLD_SETTING).build(); + when(flagsManager.getFlags()).thenReturn(List.of(protectionFlag, settingFlag, worldSettingFlag)); + when(plugin.getFlagsManager()).thenReturn(flagsManager); + + pm.registerDefaultPlaceholders(addon); + + // GameModePlaceholder.values().length + 304 (team/island) + 3 (flag placeholders) + verify(hook, times(GameModePlaceholder.values().length + 304 + 3)) + .registerPlaceholder(any(GameModeAddon.class), anyString(), anyString(), any(PlaceholderReplacer.class)); + } + + @Test + void testRegisterFlagPlaceholderProtection() { + Flag protectionFlag = new Flag.Builder("BREAK_BLOCKS", Material.STONE_PICKAXE).build(); + pm.registerFlagPlaceholder(addon, protectionFlag); + + verify(hook).registerPlaceholder(eq(addon), eq("flag_break_blocks"), + eq("Minimum rank required for BREAK_BLOCKS on the player's island"), + any(PlaceholderReplacer.class)); + } + + @Test + void testRegisterFlagPlaceholderSetting() { + Flag settingFlag = new Flag.Builder("PVP_OVERWORLD", Material.ARROW).type(Flag.Type.SETTING).build(); + pm.registerFlagPlaceholder(addon, settingFlag); + + verify(hook).registerPlaceholder(eq(addon), eq("flag_pvp_overworld"), + eq("Whether PVP_OVERWORLD is enabled on the player's island (true/false)"), + any(PlaceholderReplacer.class)); + } + + @Test + void testRegisterFlagPlaceholderWorldSetting() { + Flag worldSettingFlag = new Flag.Builder("ENDER_CHEST", Material.ENDER_CHEST).type(Flag.Type.WORLD_SETTING).build(); + pm.registerFlagPlaceholder(addon, worldSettingFlag); + + verify(hook).registerPlaceholder(eq(addon), eq("flag_ender_chest"), + eq("Whether ENDER_CHEST is enabled in the world (true/false)"), + any(PlaceholderReplacer.class)); + } + + @Test + void testRegisterFlagPlaceholderSkipsDuplicate() { + when(hook.isPlaceholder(addon, "flag_break_blocks")).thenReturn(true); + Flag protectionFlag = new Flag.Builder("BREAK_BLOCKS", Material.STONE_PICKAXE).build(); + pm.registerFlagPlaceholder(addon, protectionFlag); + + // Should not register because it's already registered + verify(hook, never()).registerPlaceholder(eq(addon), eq("flag_break_blocks"), + anyString(), any(PlaceholderReplacer.class)); + } + + @Test + void testRegisterFlagPlaceholdersNullFlagsManager() { + when(plugin.getFlagsManager()).thenReturn(null); + // Should not throw + pm.registerDefaultPlaceholders(addon); + // Only the standard game mode placeholders + team/island placeholders should be registered (no flag ones) + verify(hook, times(GameModePlaceholder.values().length + 304)) + .registerPlaceholder(any(GameModeAddon.class), anyString(), anyString(), any(PlaceholderReplacer.class)); + } } From 23e3ac23b62f9dbd532d2f1ff50246fd98c8c610 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 01:39:03 +0000 Subject: [PATCH 66/95] Initial plan From 091885ac82982dae8e735797a7a7c550c4291865 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 01:47:17 +0000 Subject: [PATCH 67/95] Add lava tip hologram for newly formed scoopable obsidian When obsidian forms from lava/water interaction and is solitary (could be scooped), a TextDisplay hologram is shown above the block for a configurable duration. The hologram uses MiniMessage locale text from the OBSIDIAN_SCOOPING section. - Add obsidian-scooping-lava-tip-duration setting (default 30s, 0 disables) - Add lavaTip locale entry in en-US.yml - Add BlockFormEvent handler in ObsidianScoopingListener - Add hologram placement logic (above, sides, below preference) - Schedule hologram removal after configured duration - Add comprehensive tests for new functionality Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/9e56595b-e55a-4b06-a281-117940895a89 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../world/bentobox/bentobox/Settings.java | 29 +++ .../ObsidianScoopingListener.java | 100 +++++++++ src/main/resources/locales/en-US.yml | 1 + .../ObsidianScoopingListenerTest.java | 196 ++++++++++++++++++ 4 files changed, 326 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/Settings.java b/src/main/java/world/bentobox/bentobox/Settings.java index 41f869604..028e24ab3 100644 --- a/src/main/java/world/bentobox/bentobox/Settings.java +++ b/src/main/java/world/bentobox/bentobox/Settings.java @@ -402,6 +402,13 @@ public class Settings implements ConfigObject { @ConfigEntry(path = "island.obsidian-scooping-cooldown", since = "3.11.4") private int obsidianScoopingCooldown = 1; + @ConfigComment("How long (in seconds) to show a hologram tip above newly formed obsidian") + @ConfigComment("that can be scooped back into lava. The hologram reminds players they can") + @ConfigComment("right-click obsidian with an empty bucket to recover lava.") + @ConfigComment("Set to 0 or less to disable the tip entirely. Default is 30 seconds.") + @ConfigEntry(path = "island.obsidian-scooping-lava-tip-duration", since = "3.12.0") + private int obsidianScoopingLavaTipDuration = 30; + /* WEB */ @ConfigComment("Toggle whether BentoBox can connect to GitHub to get data about updates and addons.") @ConfigComment("Disabling this will result in the deactivation of the update checker and of some other") @@ -1243,6 +1250,28 @@ public void setObsidianScoopingCooldown(int obsidianScoopingCooldown) { this.obsidianScoopingCooldown = Math.max(1, obsidianScoopingCooldown); } + /** + * Gets the duration (in seconds) for showing the lava tip hologram above + * newly formed obsidian blocks that can be scooped. + * + * @return the lava tip duration in seconds; 0 or less means disabled + * @since 3.12.0 + */ + public int getObsidianScoopingLavaTipDuration() { + return obsidianScoopingLavaTipDuration; + } + + /** + * Sets the duration (in seconds) for showing the lava tip hologram above + * newly formed obsidian blocks that can be scooped. + * + * @param obsidianScoopingLavaTipDuration the duration in seconds; 0 or less disables + * @since 3.12.0 + */ + public void setObsidianScoopingLavaTipDuration(int obsidianScoopingLavaTipDuration) { + this.obsidianScoopingLavaTipDuration = obsidianScoopingLavaTipDuration; + } + /** * @return the islandNumber * @since 2.0.0 diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java index 141c34da0..841e62728 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java @@ -9,23 +9,31 @@ import org.bukkit.Bukkit; import org.bukkit.FluidCollisionMode; import org.bukkit.GameMode; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Display; import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.util.RayTraceResult; +import net.kyori.adventure.text.Component; + import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.flags.FlagListener; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.lists.Flags; import world.bentobox.bentobox.util.ExpiringSet; +import world.bentobox.bentobox.util.Util; /** * Enables changing of obsidian back into lava @@ -34,6 +42,17 @@ */ public class ObsidianScoopingListener extends FlagListener { + private static final String LAVA_TIP_REFERENCE = "protection.flags.OBSIDIAN_SCOOPING.lavaTip"; + + /** + * The preferred order for hologram placement: above, sides, then below. + */ + private static final BlockFace[] HOLOGRAM_FACES = { + BlockFace.UP, + BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST, + BlockFace.DOWN + }; + /** * Cooldown to prevent lava duplication by rapid obsidian scooping. * Initialized lazily on first use so that the configured duration from settings @@ -69,6 +88,87 @@ private ExpiringSet getCooldowns() { public void onPlayerInteractEvent(final PlayerInteractEvent e) { onPlayerInteract(e); } + + /** + * Shows a hologram tip when obsidian forms from lava and water mixing, + * if the obsidian could potentially be scooped back into lava. + * + * @param e the block form event + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onObsidianForm(final BlockFormEvent e) { + handleObsidianForm(e); + } + + /** + * Handles obsidian formation and shows a lava tip hologram if applicable. + * + * @param e the block form event + * @return true if a hologram was spawned, false otherwise + */ + boolean handleObsidianForm(final BlockFormEvent e) { + if (!Material.OBSIDIAN.equals(e.getNewState().getType())) { + return false; + } + Block b = e.getBlock(); + if (!getIWM().inWorld(b.getLocation()) || !Flags.OBSIDIAN_SCOOPING.isSetForWorld(b.getWorld())) { + return false; + } + int duration = BentoBox.getInstance().getSettings().getObsidianScoopingLavaTipDuration(); + if (duration <= 0) { + return false; + } + int radius = BentoBox.getInstance().getSettings().getObsidianScoopingRadius(); + // Check if this obsidian is solitary (could be scooped) + if (radius > 0 && getBlocksAround(b, radius).stream().anyMatch(block -> block.getType().equals(Material.OBSIDIAN))) { + return false; + } + // Find a suitable location for the hologram + Location holoLoc = findHologramLocation(b); + if (holoLoc == null) { + return false; + } + // Get the lava tip text from the locale + String tipText = BentoBox.getInstance().getLocalesManager().getOrDefault(LAVA_TIP_REFERENCE, ""); + if (tipText.isEmpty()) { + return false; + } + Component tipComponent = Util.parseMiniMessage(tipText); + // Spawn a TextDisplay hologram + TextDisplay hologram = b.getWorld().spawn(holoLoc, TextDisplay.class, td -> { + td.text(tipComponent); + td.setBillboard(Display.Billboard.CENTER); + td.setSeeThrough(true); + td.setGravity(false); + }); + // Schedule removal after the configured duration + Bukkit.getScheduler().runTaskLater(BentoBox.getInstance(), () -> { + if (hologram.isValid()) { + hologram.remove(); + } + }, duration * 20L); + return true; + } + + /** + * Finds a suitable location for a hologram near the given block. + * Prefers above the block, then sides, then below. + * A location is suitable if the block there is air or a liquid. + * + * @param b the obsidian block + * @return a suitable location, or null if none found + */ + Location findHologramLocation(Block b) { + for (BlockFace face : HOLOGRAM_FACES) { + Block relative = b.getRelative(face); + Material type = relative.getType(); + if (type.isAir() || relative.isLiquid()) { + return relative.getLocation().add(0.5, 0.5, 0.5); + } + } + return null; + } + /** * Enables changing of obsidian back into lava * diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index d45e50b2f..64d6a5258 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -1508,6 +1508,7 @@ protection: cooldown: 'You must wait before scooping another obsidian block.' obsidian-nearby: 'There are obsidian blocks within a [radius]-block radius of this obsidian. You cannot scoop it up into lava.' + lavaTip: 'Scoop this up as lava with a bucket if you need it!' OFFLINE_GROWTH: description: |- When disabled, plants diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java index f509f417c..cce712968 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java @@ -1,15 +1,23 @@ package world.bentobox.bentobox.listeners.flags.worldsettings; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.function.Consumer; +import org.bukkit.Bukkit; import org.bukkit.FluidCollisionMode; import org.bukkit.GameMode; import org.bukkit.Location; @@ -17,10 +25,14 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; +import org.bukkit.entity.TextDisplay; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.RayTraceResult; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -31,6 +43,7 @@ import world.bentobox.bentobox.CommonTestSetup; import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.managers.LocalesManager; class ObsidianScoopingListenerTest extends CommonTestSetup { @@ -229,6 +242,189 @@ void testOnPlayerInteractCooldown() { assertFalse(listener.onPlayerInteract(event)); } + // --- Tests for BlockFormEvent (lava tip hologram) --- + + @Test + void testObsidianFormNotObsidian() { + BlockFormEvent event = createBlockFormEvent(Material.COBBLESTONE); + assertFalse(listener.handleObsidianForm(event)); + } + + @Test + void testObsidianFormNotInWorld() { + when(iwm.inWorld(any(Location.class))).thenReturn(false); + BlockFormEvent event = createBlockFormEvent(Material.OBSIDIAN); + assertFalse(listener.handleObsidianForm(event)); + } + + @Test + void testObsidianFormFlagDisabled() { + WorldSettings ws = mock(WorldSettings.class); + when(iwm.getWorldSettings(Mockito.any())).thenReturn(ws); + Map map = new HashMap<>(); + map.put("OBSIDIAN_SCOOPING", false); + when(ws.getWorldFlags()).thenReturn(map); + + BlockFormEvent event = createBlockFormEvent(Material.OBSIDIAN); + assertFalse(listener.handleObsidianForm(event)); + } + + @Test + void testObsidianFormDurationDisabled() { + // Set duration to 0 (disabled) + plugin.getSettings().setObsidianScoopingLavaTipDuration(0); + + BlockFormEvent event = createBlockFormEvent(Material.OBSIDIAN); + assertFalse(listener.handleObsidianForm(event)); + } + + @Test + void testObsidianFormWithNearbyObsidian() { + // Set up block with nearby obsidian + Block obsidianBlock = mock(Block.class); + when(obsidianBlock.getType()).thenReturn(Material.OBSIDIAN); + when(world.getBlockAt(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(obsidianBlock); + + BlockFormEvent event = createBlockFormEvent(Material.OBSIDIAN); + assertFalse(listener.handleObsidianForm(event)); + } + + @Test + void testObsidianFormSolitaryShowsHologram() { + // Set up solitary obsidian (no nearby obsidian) + Block airBlock = mock(Block.class); + when(airBlock.getType()).thenReturn(Material.AIR); + when(world.getBlockAt(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(airBlock); + + // Mock the locale manager to return a tip text + LocalesManager localesManager = mock(LocalesManager.class); + when(plugin.getLocalesManager()).thenReturn(localesManager); + when(localesManager.getOrDefault(any(String.class), any(String.class))) + .thenReturn("Scoop this up!"); + + // Mock TextDisplay spawning + TextDisplay mockHologram = mock(TextDisplay.class); + when(mockHologram.isValid()).thenReturn(true); + when(world.spawn(any(Location.class), eq(TextDisplay.class), any(Consumer.class))).thenReturn(mockHologram); + + // Mock scheduler + BukkitTask mockTask = mock(BukkitTask.class); + when(sch.runTaskLater(any(), any(Runnable.class), anyLong())).thenReturn(mockTask); + + BlockFormEvent event = createBlockFormEvent(Material.OBSIDIAN); + assertTrue(listener.handleObsidianForm(event)); + + // Verify hologram was spawned + verify(world).spawn(any(Location.class), eq(TextDisplay.class), any(Consumer.class)); + // Verify a delayed removal task was scheduled (30 seconds = 600 ticks) + verify(sch).runTaskLater(any(), any(Runnable.class), eq(600L)); + } + + @Test + void testObsidianFormEmptyTipText() { + // Set up solitary obsidian + Block airBlock = mock(Block.class); + when(airBlock.getType()).thenReturn(Material.AIR); + when(world.getBlockAt(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(airBlock); + + // Mock the locale manager to return empty text + LocalesManager localesManager = mock(LocalesManager.class); + when(plugin.getLocalesManager()).thenReturn(localesManager); + when(localesManager.getOrDefault(any(String.class), any(String.class))).thenReturn(""); + + BlockFormEvent event = createBlockFormEvent(Material.OBSIDIAN); + assertFalse(listener.handleObsidianForm(event)); + + // Verify no hologram was spawned + verify(world, never()).spawn(any(Location.class), eq(TextDisplay.class), any(Consumer.class)); + } + + @Test + void testFindHologramLocationAbove() { + Block above = mock(Block.class); + when(above.getType()).thenReturn(Material.AIR); + Location aboveLoc = mock(Location.class); + when(above.getLocation()).thenReturn(aboveLoc); + when(aboveLoc.add(0.5, 0.5, 0.5)).thenReturn(aboveLoc); + when(above.isLiquid()).thenReturn(false); + + when(clickedBlock.getRelative(BlockFace.UP)).thenReturn(above); + + Location result = listener.findHologramLocation(clickedBlock); + assertNotNull(result); + } + + @Test + void testFindHologramLocationSide() { + // Above is solid + Block solidBlock = mock(Block.class); + when(solidBlock.getType()).thenReturn(Material.STONE); + when(solidBlock.isLiquid()).thenReturn(false); + when(clickedBlock.getRelative(BlockFace.UP)).thenReturn(solidBlock); + + // North is air + Block northBlock = mock(Block.class); + when(northBlock.getType()).thenReturn(Material.AIR); + Location northLoc = mock(Location.class); + when(northBlock.getLocation()).thenReturn(northLoc); + when(northLoc.add(0.5, 0.5, 0.5)).thenReturn(northLoc); + when(northBlock.isLiquid()).thenReturn(false); + when(clickedBlock.getRelative(BlockFace.NORTH)).thenReturn(northBlock); + + Location result = listener.findHologramLocation(clickedBlock); + assertNotNull(result); + } + + @Test + void testFindHologramLocationLiquid() { + // Above is water (liquid) - should be valid + Block waterBlock = mock(Block.class); + when(waterBlock.getType()).thenReturn(Material.WATER); + when(waterBlock.isLiquid()).thenReturn(true); + Location waterLoc = mock(Location.class); + when(waterBlock.getLocation()).thenReturn(waterLoc); + when(waterLoc.add(0.5, 0.5, 0.5)).thenReturn(waterLoc); + when(clickedBlock.getRelative(BlockFace.UP)).thenReturn(waterBlock); + + Location result = listener.findHologramLocation(clickedBlock); + assertNotNull(result); + } + + @Test + void testFindHologramLocationAllBlocked() { + // All surrounding blocks are solid + Block solidBlock = mock(Block.class); + when(solidBlock.getType()).thenReturn(Material.STONE); + when(solidBlock.isLiquid()).thenReturn(false); + when(clickedBlock.getRelative(any(BlockFace.class))).thenReturn(solidBlock); + + Location result = listener.findHologramLocation(clickedBlock); + assertNull(result); + } + + private BlockFormEvent createBlockFormEvent(Material newStateType) { + Block formBlock = mock(Block.class); + when(formBlock.getX()).thenReturn(0); + when(formBlock.getY()).thenReturn(64); + when(formBlock.getZ()).thenReturn(0); + when(formBlock.getWorld()).thenReturn(world); + when(formBlock.getLocation()).thenReturn(location); + + // Set up relative blocks for hologram placement + Block airAbove = mock(Block.class); + when(airAbove.getType()).thenReturn(Material.AIR); + when(airAbove.isLiquid()).thenReturn(false); + Location aboveLoc = mock(Location.class); + when(airAbove.getLocation()).thenReturn(aboveLoc); + when(aboveLoc.add(0.5, 0.5, 0.5)).thenReturn(aboveLoc); + when(formBlock.getRelative(any(BlockFace.class))).thenReturn(airAbove); + + BlockState newState = mock(BlockState.class); + when(newState.getType()).thenReturn(newStateType); + + return new BlockFormEvent(formBlock, newState); + } + private void testEvent() { when(item.getType()).thenReturn(inHand); when(clickedBlock.getType()).thenReturn(block); From 090adbd112cea283ef4a058cae86d0709fa5905f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 01:51:41 +0000 Subject: [PATCH 68/95] Refactor: store BentoBox.getInstance() in local variable Address code review feedback to avoid calling BentoBox.getInstance() multiple times within handleObsidianForm method. Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/9e56595b-e55a-4b06-a281-117940895a89 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../flags/worldsettings/ObsidianScoopingListener.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java index 841e62728..2a3f426b6 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java @@ -114,11 +114,12 @@ boolean handleObsidianForm(final BlockFormEvent e) { if (!getIWM().inWorld(b.getLocation()) || !Flags.OBSIDIAN_SCOOPING.isSetForWorld(b.getWorld())) { return false; } - int duration = BentoBox.getInstance().getSettings().getObsidianScoopingLavaTipDuration(); + BentoBox bentoBox = BentoBox.getInstance(); + int duration = bentoBox.getSettings().getObsidianScoopingLavaTipDuration(); if (duration <= 0) { return false; } - int radius = BentoBox.getInstance().getSettings().getObsidianScoopingRadius(); + int radius = bentoBox.getSettings().getObsidianScoopingRadius(); // Check if this obsidian is solitary (could be scooped) if (radius > 0 && getBlocksAround(b, radius).stream().anyMatch(block -> block.getType().equals(Material.OBSIDIAN))) { return false; @@ -129,7 +130,7 @@ boolean handleObsidianForm(final BlockFormEvent e) { return false; } // Get the lava tip text from the locale - String tipText = BentoBox.getInstance().getLocalesManager().getOrDefault(LAVA_TIP_REFERENCE, ""); + String tipText = bentoBox.getLocalesManager().getOrDefault(LAVA_TIP_REFERENCE, ""); if (tipText.isEmpty()) { return false; } @@ -142,7 +143,7 @@ boolean handleObsidianForm(final BlockFormEvent e) { td.setGravity(false); }); // Schedule removal after the configured duration - Bukkit.getScheduler().runTaskLater(BentoBox.getInstance(), () -> { + Bukkit.getScheduler().runTaskLater(bentoBox, () -> { if (hologram.isValid()) { hologram.remove(); } From fcaf3d15405b7f3cc72c6aa403b825d57c07abd1 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 12:03:21 -0700 Subject: [PATCH 69/95] Disable chunk pre-generation in config.yml to reduce resource usage --- src/main/resources/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e1bf39a86..00001355e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -230,7 +230,7 @@ island: # to reduce lag when islands are created or reset. # Enable or disable chunk pre-generation. # Added since 3.14.0. - enabled: true + enabled: false # Number of future islands to pre-generate chunks for, per game mode world. # Higher values use more disk space but reduce the chance of lag on island creation. # Added since 3.14.0. From ebe27f29fe668bb1dc44a2ae917ffb1dc27a6999 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 12:09:13 -0700 Subject: [PATCH 70/95] Update version annotations and documentation for island protection settings --- .../api/commands/admin/purge/AdminPurgeRegionsCommand.java | 4 ++-- .../api/flags/clicklisteners/IslandDefaultCycleClick.java | 2 +- .../bentobox/panels/settings/IslandDefaultSettingsTab.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java index 1709ad4cf..294fe17a4 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/purge/AdminPurgeRegionsCommand.java @@ -202,10 +202,10 @@ private void deletePlayerFile(File file, String description) { * Resolves the base data folder for a world, accounting for the dimension * subfolder layout. *

- * Pre-26.1 (old format): Nether data lives in {@code DIM-1/} and + * Pre-Minecraft version 26.1 (old format): Nether data lives in {@code DIM-1/} and * End data lives in {@code DIM1/} subfolders inside the world folder. *

- * 26.1.1+ (new format): Each dimension has its own world folder + * Minecraft version 26.1.1+ (new format): Each dimension has its own world folder * under {@code dimensions/minecraft/} and data (region/, entities/, poi/) * lives directly in it — no DIM-1/DIM1 subfolders. * diff --git a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java index db93e269d..a72491c1e 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandDefaultCycleClick.java @@ -17,7 +17,7 @@ * Left-clicks increase the default island protection rank, right-clicks decrease it. * This modifies the default rank that new islands will receive for a protection flag. * @author tastybento - * @since 3.2.0 + * @since 3.14.0 */ public class IslandDefaultCycleClick implements PanelItem.ClickHandler { diff --git a/src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java b/src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java index 0f1e44bbf..7e0bf0287 100644 --- a/src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java +++ b/src/main/java/world/bentobox/bentobox/panels/settings/IslandDefaultSettingsTab.java @@ -20,7 +20,7 @@ * Implements a {@link Tab} that enables the default island protection settings to be changed. * These are the protection flag rank values that new islands will receive. * @author tastybento - * @since 3.2.0 + * @since 3.14.0 */ public class IslandDefaultSettingsTab extends SettingsTab implements Tab { From f85e1fd82e80fc9511f7b64fa64de5a6a769fcf1 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 15:43:20 -0700 Subject: [PATCH 71/95] Bump build version to 3.14.0 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3bee23186..cb3a31791 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,7 +46,7 @@ paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArt group = "world.bentobox" // From // Base properties from -val buildVersion = "3.13.1" +val buildVersion = "3.14.0" val buildNumberDefault = "-LOCAL" // Local build identifier val snapshotSuffix = "-SNAPSHOT" // Indicates development/snapshot version From 2272aee86ef52995a8bf55c0de9660682724f809 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 16:03:08 -0700 Subject: [PATCH 72/95] Defer chunk pre-gen until after server load and avoid main-thread stalls ChunkPregenManager's schedulePregen ran on BentoBoxReadyEvent during startup and called Util.isChunkGenerated thousands of times on the main thread. CraftWorld.isChunkGenerated blocks on region/IO workers during startup, causing 10-15+ second Paper watchdog stalls. Gate the initial sweep on ServerLoadEvent, drop the blocking pre-filter, and replace the tick-time check with an async getChunkAtAsync(..., false) probe that generates only when the chunk does not already exist. Co-Authored-By: Claude Opus 4.6 --- .../bentobox/managers/ChunkPregenManager.java | 65 ++++++++++++++++--- .../managers/ChunkPregenManagerTest.java | 43 +++++++++--- 2 files changed, 90 insertions(+), 18 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java b/src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java index 196190c98..08cd2b1d9 100644 --- a/src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/ChunkPregenManager.java @@ -13,6 +13,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.server.ServerLoadEvent; import org.bukkit.scheduler.BukkitTask; import world.bentobox.bentobox.BentoBox; @@ -44,21 +45,58 @@ private record ChunkCoord(World world, int chunkX, int chunkZ) {} private final List activeWorlds = new ArrayList<>(); private BukkitTask schedulerTask; private int roundRobinIndex; + /** Set true once {@link BentoBoxReadyEvent} has fired. */ + private boolean bentoBoxReady; + /** Set true once {@link ServerLoadEvent} has fired (server has finished starting/reloading). */ + private boolean serverLoaded; + /** Guards against running the initial pregen sweep more than once. */ + private boolean initialPregenDone; public ChunkPregenManager(BentoBox plugin) { this.plugin = plugin; } /** - * Starts pre-generation for all game mode addons when BentoBox is fully loaded. + * Records that BentoBox is ready and tries to kick off the initial pre-gen sweep. + * Actual scheduling is deferred until the server has also finished starting up + * (see {@link #onServerLoad(ServerLoadEvent)}) so that the expensive chunk + * enumeration never runs on the main thread during startup. * * @param e the ready event */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBentoBoxReady(BentoBoxReadyEvent e) { + bentoBoxReady = true; + tryStartInitialPregen(); + } + + /** + * Marks the server as loaded and tries to kick off the initial pre-gen sweep. + * Fires on {@link ServerLoadEvent} which Paper dispatches once the server has + * finished its startup (or reload) sequence — at that point main-thread + * chunk calls are no longer blocked waiting on region/IO workers. + * + * @param e the server load event + */ + @EventHandler(priority = EventPriority.MONITOR) + public void onServerLoad(ServerLoadEvent e) { + serverLoaded = true; + tryStartInitialPregen(); + } + + /** + * Runs the one-shot "schedule pregen for every game mode addon" pass, but only + * once both the BentoBox ready event and the server load event have fired. + */ + private void tryStartInitialPregen() { + if (initialPregenDone || !bentoBoxReady || !serverLoaded) { + return; + } if (!plugin.getSettings().isPregenEnabled()) { + initialPregenDone = true; return; } + initialPregenDone = true; plugin.getAddonsManager().getGameModeAddons().forEach(this::schedulePregen); startTask(); } @@ -150,7 +188,11 @@ public void schedulePregen(GameModeAddon addon) { int centerChunkX = center.getBlockX() >> 4; int centerChunkZ = center.getBlockZ() >> 4; - // Collect chunks per world + // Collect chunks per world. Do NOT call Util.isChunkGenerated here — on a + // freshly started server that method blocks the main thread waiting for + // region/IO workers, and doing thousands of sequential calls stalls the + // server for 10+ seconds. The tick-time probe (see tick()) uses an async + // variant that won't block the main thread. List> perWorld = new ArrayList<>(); for (World w : worlds) { List chunks = new ArrayList<>(); @@ -158,9 +200,7 @@ public void schedulePregen(GameModeAddon addon) { for (int dz = -viewDistance; dz <= viewDistance; dz++) { int cx = centerChunkX + dx; int cz = centerChunkZ + dz; - if (!Util.isChunkGenerated(w, cx, cz)) { - chunks.add(new ChunkCoord(w, cx, cz)); - } + chunks.add(new ChunkCoord(w, cx, cz)); } } perWorld.add(chunks); @@ -293,11 +333,16 @@ private void tick() { int batchSize = Math.max(1, chunksPerTick / activeWorlds.size()); for (int i = 0; i < batchSize && dispatched < chunksPerTick && !queue.isEmpty(); i++) { ChunkCoord coord = queue.poll(); - // Double-check: skip if already generated since queueing - if (!Util.isChunkGenerated(coord.world(), coord.chunkX(), coord.chunkZ())) { - Util.getChunkAtAsync(coord.world(), coord.chunkX(), coord.chunkZ()); - dispatched++; - } + // Async probe first (gen=false). If the chunk doesn't yet exist the + // future completes with null — then we fire the real generation call. + // Both legs are off the main thread on Paper, so no blocking occurs. + Util.getChunkAtAsync(coord.world(), coord.chunkX(), coord.chunkZ(), false) + .thenAccept(existing -> { + if (existing == null) { + Util.getChunkAtAsync(coord.world(), coord.chunkX(), coord.chunkZ(), true); + } + }); + dispatched++; } roundRobinIndex++; diff --git a/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java index 6ca65bf17..a92d0d113 100644 --- a/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; @@ -18,6 +19,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.event.server.ServerLoadEvent; import org.bukkit.scheduler.BukkitTask; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -53,6 +55,8 @@ class ChunkPregenManagerTest extends CommonTestSetup { private IslandResettedEvent resettedEvent; @Mock private BentoBoxReadyEvent readyEvent; + @Mock + private ServerLoadEvent serverLoadEvent; private ChunkPregenManager manager; private Settings settings; @@ -102,6 +106,8 @@ public void setUp() throws Exception { mockedUtil.when(() -> Util.isChunkGenerated(any(World.class), anyInt(), anyInt())).thenReturn(false); mockedUtil.when(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt())) .thenReturn(CompletableFuture.completedFuture(null)); + mockedUtil.when(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt(), anyBoolean())) + .thenReturn(CompletableFuture.completedFuture(null)); // plugin.log() — avoid NPE; real Settings already wired by CommonTestSetup doNothing().when(plugin).log(anyString()); @@ -134,16 +140,36 @@ void testConstructor() { @Test void testOnBentoBoxReady_pregenDisabled() { settings.setPregenEnabled(false); + manager.onServerLoad(serverLoadEvent); manager.onBentoBoxReady(readyEvent); verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); } @Test void testOnBentoBoxReady_pregenEnabled() { + manager.onServerLoad(serverLoadEvent); + manager.onBentoBoxReady(readyEvent); + verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); + } + + @Test + void testOnBentoBoxReady_deferredUntilServerLoaded() { + // Ready event alone should NOT schedule anything — the server hasn't loaded yet manager.onBentoBoxReady(readyEvent); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + + // Once the server reports loaded, the initial sweep should run + manager.onServerLoad(serverLoadEvent); verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); } + @Test + void testOnServerLoad_beforeReadyEvent_noSchedule() { + // Server load alone without the ready event should not schedule + manager.onServerLoad(serverLoadEvent); + verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + } + // ----------------------------------------------------------------------- // onIslandCreated // ----------------------------------------------------------------------- @@ -235,8 +261,8 @@ void testSchedulePregen_globalDefault_queuesChunks() { verify(sch).runTaskTimer(eq(plugin), cap.capture(), anyLong(), anyLong()); cap.getValue().run(); - // At least one chunk async request should have been made - mockedUtil.verify(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt()), + // At least one async chunk probe should have been issued (gen=false leg) + mockedUtil.verify(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt(), anyBoolean()), org.mockito.Mockito.atLeastOnce()); } @@ -277,11 +303,12 @@ void testSchedulePregen_withNonNullLastLocation() { } @Test - void testSchedulePregen_allChunksAlreadyGenerated_noTask() { - // If every chunk is already generated the queue stays empty → no task - mockedUtil.when(() -> Util.isChunkGenerated(any(World.class), anyInt(), anyInt())).thenReturn(true); + void testSchedulePregen_doesNotCallIsChunkGeneratedOnMainThread() { + // Regression guard: schedulePregen must never call the blocking + // Util.isChunkGenerated — doing so on startup stalls the main thread + // for 10+ seconds because CraftWorld.isChunkGenerated blocks on IO workers. manager.schedulePregen(addon); - verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); + mockedUtil.verify(() -> Util.isChunkGenerated(any(World.class), anyInt(), anyInt()), never()); } // ----------------------------------------------------------------------- @@ -371,8 +398,8 @@ void testTick_dispatchesChunksWhenQueued() { cap.getValue().run(); // one tick - // Verify async chunk requests were issued - mockedUtil.verify(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt()), + // Verify async chunk probes were issued (new 4-arg form with gen=false) + mockedUtil.verify(() -> Util.getChunkAtAsync(any(World.class), anyInt(), anyInt(), anyBoolean()), org.mockito.Mockito.atLeastOnce()); } } From dae71e77f0b4dc045bf082de0568605a61607362 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 16:03:36 -0700 Subject: [PATCH 73/95] Update obsidian scooping lava tip duration and improve related messages --- src/main/java/world/bentobox/bentobox/Settings.java | 6 +++--- src/main/resources/locales/en-US.yml | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/Settings.java b/src/main/java/world/bentobox/bentobox/Settings.java index 028e24ab3..615a3c3f9 100644 --- a/src/main/java/world/bentobox/bentobox/Settings.java +++ b/src/main/java/world/bentobox/bentobox/Settings.java @@ -405,9 +405,9 @@ public class Settings implements ConfigObject { @ConfigComment("How long (in seconds) to show a hologram tip above newly formed obsidian") @ConfigComment("that can be scooped back into lava. The hologram reminds players they can") @ConfigComment("right-click obsidian with an empty bucket to recover lava.") - @ConfigComment("Set to 0 or less to disable the tip entirely. Default is 30 seconds.") - @ConfigEntry(path = "island.obsidian-scooping-lava-tip-duration", since = "3.12.0") - private int obsidianScoopingLavaTipDuration = 30; + @ConfigComment("Set to 0 or less to disable the tip entirely. Default is 5 seconds.") + @ConfigEntry(path = "island.obsidian-scooping-lava-tip-duration", since = "3.14.0") + private int obsidianScoopingLavaTipDuration = 5; /* WEB */ @ConfigComment("Toggle whether BentoBox can connect to GitHub to get data about updates and addons.") diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 64d6a5258..3743546e7 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -1508,7 +1508,9 @@ protection: cooldown: 'You must wait before scooping another obsidian block.' obsidian-nearby: 'There are obsidian blocks within a [radius]-block radius of this obsidian. You cannot scoop it up into lava.' - lavaTip: 'Scoop this up as lava with a bucket if you need it!' + lavaTip: |- + Scoop this up with a bucket + as lava again if you need it! OFFLINE_GROWTH: description: |- When disabled, plants From 1580ab3cd7dc31ad55f5e7f8cd40335812f7a212 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 16:15:00 -0700 Subject: [PATCH 74/95] Remove obsidian lava tip hologram immediately when scooped Track active lava-tip holograms by obsidian block location so they can be cleared as soon as the player scoops the obsidian back into lava, instead of lingering until the timed removal fires. Co-Authored-By: Claude Opus 4.6 --- .../ObsidianScoopingListener.java | 29 +++++++++++- .../ObsidianScoopingListenerTest.java | 45 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java index 2a3f426b6..f1392b962 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.bukkit.Bukkit; @@ -62,6 +63,12 @@ public class ObsidianScoopingListener extends FlagListener { @SuppressWarnings("java:S3077") // volatile is correct here for double-checked locking lazy init private volatile ExpiringSet cooldowns; + /** + * Active lava-tip holograms keyed by the obsidian block's location, so they can be + * removed immediately if the obsidian is scooped before the timed removal fires. + */ + private final Map activeHolograms = new ConcurrentHashMap<>(); + /** * Returns the cooldown set, initializing it lazily on first use with the * configured duration from {@link world.bentobox.bentobox.Settings#getObsidianScoopingCooldown()}. @@ -142,15 +149,33 @@ boolean handleObsidianForm(final BlockFormEvent e) { td.setSeeThrough(true); td.setGravity(false); }); + Location key = b.getLocation(); + // Replace any existing hologram tracked at this location + TextDisplay previous = activeHolograms.put(key, hologram); + if (previous != null && previous.isValid()) { + previous.remove(); + } // Schedule removal after the configured duration Bukkit.getScheduler().runTaskLater(bentoBox, () -> { - if (hologram.isValid()) { + if (activeHolograms.remove(key, hologram) && hologram.isValid()) { hologram.remove(); } }, duration * 20L); return true; } + /** + * Removes any active lava-tip hologram associated with the given obsidian block. + * + * @param b the obsidian block being scooped + */ + private void removeHologramFor(Block b) { + TextDisplay hologram = activeHolograms.remove(b.getLocation()); + if (hologram != null && hologram.isValid()) { + hologram.remove(); + } + } + /** * Finds a suitable location for a hologram near the given block. * Prefers above the block, then sides, then below. @@ -251,6 +276,8 @@ private void givePlayerLava(Player player, Block b, ItemStack bucket) { } // Set block to air only after giving bucket b.setType(Material.AIR); + // Remove the lava tip hologram, if any, since the obsidian is gone + removeHologramFor(b); } private List getBlocksAround(Block b, int radius) { diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java index cce712968..1fcc24fba 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java @@ -37,6 +37,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; @@ -291,6 +292,8 @@ void testObsidianFormWithNearbyObsidian() { @Test void testObsidianFormSolitaryShowsHologram() { + // Set duration explicitly so the scheduled tick count is deterministic + plugin.getSettings().setObsidianScoopingLavaTipDuration(30); // Set up solitary obsidian (no nearby obsidian) Block airBlock = mock(Block.class); when(airBlock.getType()).thenReturn(Material.AIR); @@ -320,6 +323,48 @@ void testObsidianFormSolitaryShowsHologram() { verify(sch).runTaskLater(any(), any(Runnable.class), eq(600L)); } + @Test + void testScoopingRemovesActiveHologramImmediately() { + // Spawn a hologram via BlockFormEvent + plugin.getSettings().setObsidianScoopingLavaTipDuration(30); + Block airBlock = mock(Block.class); + when(airBlock.getType()).thenReturn(Material.AIR); + when(world.getBlockAt(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(airBlock); + + LocalesManager localesManager = mock(LocalesManager.class); + when(plugin.getLocalesManager()).thenReturn(localesManager); + when(localesManager.getOrDefault(any(String.class), any(String.class))) + .thenReturn("Scoop this up!"); + + TextDisplay mockHologram = mock(TextDisplay.class); + when(mockHologram.isValid()).thenReturn(true); + when(world.spawn(any(Location.class), eq(TextDisplay.class), any(Consumer.class))).thenReturn(mockHologram); + + BukkitTask mockTask = mock(BukkitTask.class); + when(sch.runTaskLater(any(), any(Runnable.class), anyLong())).thenReturn(mockTask); + + BlockFormEvent formEvent = createBlockFormEvent(Material.OBSIDIAN); + assertTrue(listener.handleObsidianForm(formEvent)); + + // Now scoop the same obsidian block; clickedBlock must report the same Location key + when(clickedBlock.getLocation()).thenReturn(location); + when(item.getType()).thenReturn(Material.BUCKET); + when(clickedBlock.getType()).thenReturn(Material.OBSIDIAN); + + PlayerInteractEvent interactEvent = new PlayerInteractEvent(mockPlayer, Action.RIGHT_CLICK_BLOCK, item, + clickedBlock, BlockFace.EAST); + assertTrue(listener.onPlayerInteract(interactEvent)); + + // The scheduled task captured by runTask runs givePlayerLava synchronously in + // production via Bukkit; in this test we invoke it manually. + ArgumentCaptor runCaptor = ArgumentCaptor.forClass(Runnable.class); + verify(sch).runTask(any(), runCaptor.capture()); + runCaptor.getValue().run(); + + // Hologram should have been removed immediately upon scooping + verify(mockHologram).remove(); + } + @Test void testObsidianFormEmptyTipText() { // Set up solitary obsidian From 35f216a41e8bf80b370f7ec84a2c9bee805abba3 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 19:21:59 -0700 Subject: [PATCH 75/95] Update Russian --- src/main/resources/locales/ru.yml | 2182 +++++++++++++++-------------- 1 file changed, 1141 insertions(+), 1041 deletions(-) diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index 4254bd1aa..2eb98b41b 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -1,54 +1,62 @@ +# ######################################################################################## # +# Это YML файл. Будьте осторожны при редактировании. Проверяйте свои правки # +# в YAML валидаторе, например, на http://yaml-online-parser.appspot.com # +# ######################################################################################## # + meta: authors: - Moltanica_ - - ' ' + - Vinrey123 banner: BLUE_BANNER:1:STRIPE_RIGHT:WHITE:STRIPE_LEFT:RED + prefixes: - bentobox: 'BentoBox > ' + bentobox: BentoBox > island: остров Island: Остров Islands: Острова an-island: остров islands: острова general: - success: 'Успешно!' + success: Успешно! invalid: Некорректно - beta: 'Эта команда в бета -версии. Убедитесь, что у вас есть резервные копии!' + beta: Эта команда в бета-версии. Убедитесь, что у вас есть резервные копии! errors: - command-cancelled: 'Команда отменена.' - no-permission: 'У вас нет разрешения на извлечение этой команды ([permission]).' - insufficient-rank: 'Вашего ранга недостаточно чтобы сделать это! ([rank])' - use-in-game: 'Эта команда доступна только в самой игре.' - use-in-console: 'Эта команда доступна только в консоли.' - no-team: 'Вы не состоите в команде!' - no-island: 'У вас нет своего острова!' - player-has-island: 'Игрок уже имеет острова!' - player-has-no-island: 'Этот игрок не имеет острова!' - already-have-island: 'У вас уже есть остров!' - no-safe-location-found: 'Не удалось найти безопасное место при телепортации на остров.' - not-owner: 'Вы не являетесь владельцем этого острова!' - player-is-not-owner: '[name] не является владельцем острова!' - not-in-team: 'Этот игрок не состоит в вашей команде!' - offline-player: 'Указанный игрок не в сети либо не существует.' - unknown-player: 'Не обнаружена игрока с ником [name]!' - general: 'Эта команда еще не готова - свяжитесь с администрацией.' - unknown-command: 'Неизвестная команда. Введите /[label] help для помощи.' - wrong-world: 'Вы находитесь в неправильном мире для совершения действия!' - you-must-wait: 'Вы должны подождать [number] прежде чем пробовать команду снова.' - must-be-positive-number: '[number] не является корректным положительным значением.' - not-on-island: 'Вы не на острове!' - slow-down: 'Помедленнее. Кликайте медленнее.' + command-cancelled: Команда отменена. + no-permission: У вас нет разрешения на извлечение этой команды ([permission]). + insufficient-rank: Вашего ранга недостаточно чтобы сделать это! ([rank]) + use-in-game: Эта команда доступна только в самой игре. + use-in-console: Эта команда доступна только в консоли. + no-team: Вы не состоите в команде! + no-island: У вас нет своего острова! + player-has-island: Игрок уже имеет острова! + player-has-no-island: Этот игрок не имеет острова! + already-have-island: У вас уже есть остров! + no-safe-location-found: Не удалось найти безопасное место при телепортации на остров. + not-owner: Вы не являетесь владельцем этого острова! + player-is-not-owner: [name] не является владельцем острова! + not-in-team: Этот игрок не состоит в вашей команде! + offline-player: Указанный игрок не в сети либо не существует. + unknown-player: Не обнаружена игрока с ником [name]! + general: Эта команда ещё не готова - свяжитесь с администрацией. + unknown-command: Неизвестная команда. Введите /[label] help для помощи. + wrong-world: Вы находитесь в неправильном мире для совершения действия! + you-must-wait: Вы должны подождать [number] прежде чем пробовать команду снова. + must-be-positive-number: [number] не является корректным положительным значением. + not-on-island: Вы не на острове! + slow-down: Помедленнее... worlds: overworld: Верхний мир nether: Незер - the-end: Край + the-end: Энд + commands: + # Параметры в <> являются обязательными, параметры в [] — необязательными. help: - header: '=========== [label] помощь ===========' + header: =========== [label] помощь =========== syntax: '[usage] [parameters]: [description]' syntax-no-parameters: '[usage]: [description]' - end: '=================================' - page: 'Страница [page] из [total]' + end: ================================= + page: Страница [page] из [total] parameters: '[command]' description: команда помощи console: Консоль @@ -56,209 +64,205 @@ commands: help: description: команды администратора maxhomes: - description: >- - измените количество домов, разрешенных на этом [prefix_island] или у - игрока [prefix_island] + description: измените количество домов, разрешенных на этом [prefix_island] + или у игрока [prefix_island] parameters: [[prefix_island] имя] - max-homes-set: >- - [name] - Установить [prefix_island] максимальное количество домов на - [number] + max-homes-set: [name] - Установить [prefix_island] максимальное количество + домов на [number] errors: unknown-island: Неизвестный [prefix_island]! [name] resethome: description: Сбросить домашнюю точку игрока к умолчанию parameters: <игрок> [[префикс_острова] имя] - cleared: 'Сброс домашней точки. [name]' + cleared: Сброс домашней точки. [name] resets: description: редактирует количество сбросов игрока set: description: устанавливает сколько раз игроки могут сбрасывать остров parameters: <игрок> <сбрасывает> - success: 'Игрок [name]сбросил остров [number] раза.' + success: Игрок [name]сбросил остров [number] + раза. reset: description: устанавливает количество сбросов игрока на 0 parameters: <игрок> - success-everyone: 'Успешно сброшено количество сбросов до 0.' - success: 'Успешно сброшено количество сбросов игрока [name]до 0.' + success-everyone: Успешно сброшено количество сбросов до 0. + success: Успешно сброшено количество сбросов игрока [name]до + 0. add: description: добавляет этому игроку указанное количество сбросов parameters: <игрок> <сбрасывает> - success: >- - Успешно добавлено [number] сбросов игроку [name], увеличив - общее количество сбросов до [total]. + success: Успешно добавлено [number] сбросов + игроку [name], увеличив общее количество сбросов до + [total]. remove: description: уменьшает количество сбросов острова у игрока parameters: <игрок> <сбрасывает> - success: >- - Успешно уменьшено количество сбросов на [number] у игрока - [name] , уменьшив общее количество сбросов до значения [total]. + success: Успешно уменьшено количество сбросов на [number] + у игрока [name] , уменьшив общее + количество сбросов до значения [total]. purge: parameters: '[days]' description: стирает остров, заброшенный на более чем [days] дней days-one-or-more: Должно быть хотя бы 1 или больше - purgable-islands: 'Найдено [number] подходящих для очистки островов.' - too-many: >- + purgable-islands: Найдено [number] подходящих + для очистки островов. + too-many: |- Это много, и это может занять очень много времени для удаления. - - Рассмотрите возможность использования плагина Regionerator для - удаления чанков мира - - и установки keep-previous-island-on-reset: true в config.yml - BentoBox. - + Рассмотрите возможность использования плагина Regionerator для удаления чанков мира + и установки keep-previous-island-on-reset: true в config.yml BentoBox. Затем выполните очистку. - purge-in-progress: 'Очистка в процессе. Используйте /[label] purge stop для отмены.' - scanning: >- - Сканирование островов в базе данных. Это может занять некоторое время - в зависимости от того, сколько у вас количество... - scanning-in-progress: 'Сканирование в процессе, пожалуйста, подождите' - none-found: 'Не найдено островов для очистки.' - total-islands: 'У вас [number] островов в вашей базе данных во всех мирах.' - number-error: 'Значение должно быть количеством дней' - confirm: 'Введите /[label] purge confirm для начала очистки.' - completed: 'Очистка остановлена.' - see-console-for-status: >- - Очистка начата. Смотрите в консоль для статуса или используйте - /[label] purge status. - no-purge-in-progress: 'В данный момент очистка не проводится.' + purge-in-progress: Очистка в процессе. Используйте /[label] + purge stop для отмены. + scanning: Сканирование островов в базе данных. Это может занять некоторое + время в зависимости от того, сколько у вас количество... + scanning-in-progress: Сканирование в процессе, пожалуйста, подождите + none-found: Не найдено островов для очистки. + total-islands: У вас [number] островов в вашей базе данных во всех мирах. + number-error: Значение должно быть количеством дней + confirm: Введите /[label] purge confirm для + начала очистки. + completed: Очистка остановлена. + see-console-for-status: Очистка начата. Смотрите в консоль для статуса + или используйте /[label] purge status. + no-purge-in-progress: В данный момент очистка не проводится. regions: parameters: '[days]' description: очистка островов путём удаления старых файлов регионов - confirm: 'Тип /[label] purge regions confirm чтобы начать чистку' + confirm: Тип /[label] purge regions confirm + чтобы начать чистку protect: description: переключатель защиты острова от очистки - move-to-island: 'Для начала вернитесь на остров!' - protecting: 'Остров защищен от очистки.' - unprotecting: 'Защита от очистки убрана.' + move-to-island: Для начала вернитесь на остров! + protecting: Остров защищен от очистки. + unprotecting: Защита от очистки убрана. stop: description: остановить проводящуюся очистку stopping: Очистка остановлена unowned: description: позволяет очистить острова без владельцев - unowned-islands: 'Найдено [number] остров без владельца.' + unowned-islands: Найдено [number] остров + без владельца. status: description: отображает статус очистки - status: >- - [purged] островов очищено из [purgeable] ([percentage] - %). + status: [purged] островов очищено из [purgeable] + ([percentage] %). team: description: управление командой add: parameters: <владелец> <игрок> description: добавляет игрока в команду владельца - name-not-owner: '[name] не является владельцем.' - name-has-island: >- - [name] имеет или имел остров. Разрегистрируйте или удалите его - сначала! - success: '[name] был успешно добавлен на остров игрока [owner].' + name-not-owner: [name] не является владельцем. + name-has-island: [name] имеет или имел остров. Разрегистрируйте или удалите + его сначала! + success: [name] был успешно добавлен на остров игрока + [owner]. disband: parameters: <владелец> description: распустить команду владельца острова - use-disband-owner: 'Не владелец! Используйте disband [owner].' - disbanded: 'Администратор распустил вашу команду!' - success: 'Команда игрока [name] была распущена.' + use-disband-owner: Не владелец! Используйте disband [owner]. + disbanded: Администратор распустил вашу команду! + success: Команда игрока [name] была распущена. fix: description: сканирует и исправляет присутствие на более чем 1 острове одновременно scanning: Сканируем базу данных... duplicate-owner: 'Игрок владеет более чем одним островом: [name]' - player-has: 'Игрок [name] имеет [number] островов' - duplicate-member: 'Игрок [name] является участником более чем 1 острова в базе данных' - rank-on-island: '[rank] на острове по координатам [xyz]' - fixed: 'Исправлено' - done: 'Скан' + player-has: Игрок [name] имеет [number] островов + duplicate-member: Игрок [name] является участником более чем 1 острова + в базе данных + rank-on-island: [rank] на острове по координатам [xyz] + fixed: Исправлено + done: Скан kick: parameters: <игрок команды> description: выгнать игрока из команды - cannot-kick-owner: 'Вы не можете выгнать владельца. Сначала выгоните участников.' - not-in-team: 'Этот игрок не в вашей команде.' - admin-kicked: 'Администратор выгнал вас из команды.' - success: '[name] был выгнан с острова игрока [owner].' - success-all: 'Игрок удалён из всех команд в этом мире' + cannot-kick-owner: Вы не можете выгнать владельца. Сначала выгоните участников. + not-in-team: Этот игрок не в вашей команде. + admin-kicked: Администратор выгнал вас из команды. + success: [name] был выгнан с острова игрока [owner]. + success-all: Игрок удалён из всех команд в этом мире setowner: parameters: <игрок> description: передает статус владельца между игроками - already-owner: '[name] уже является владельцем острова!' - must-be-on-island: 'Вы должны быть на [prefix_island], чтобы установить владельца' - confirmation: >- - Вы уверены, что хотите сделать [name] владельцем [prefix_island] на - [xyz]? - success: '[name] теперь является владельцем острова.' - extra-islands: >- - Внимание: у этого игрока теперь есть [number] островов. Это больше, - чем разрешено настройками или правами: [max]. + already-owner: [name] уже является владельцем острова! + must-be-on-island: Вы должны быть на [prefix_island], чтобы установить + владельца + confirmation: Вы уверены, что хотите сделать [name] владельцем [prefix_island] + на [xyz]? + success: [name] теперь является владельцем острова. + extra-islands: 'Внимание: у этого игрока теперь есть [number] островов. + Это больше, чем разрешено настройками или правами: [max].' maxsize: parameters: <игрок> <размер> - description: установить максимальный размер команды для [prefix_island] игрока (0 для сброса к мировому значению по умолчанию) - success: 'Установлен максимальный размер команды [name] для [prefix_island] на [number].' - reset: 'Сброшен максимальный размер команды [name] для [prefix_island] до мирового значения по умолчанию ([number]).' + description: установить максимальный размер команды для [prefix_island] игрока + (0 для сброса к мировому значению по умолчанию) + success: Установлен максимальный размер команды [name] + для [prefix_island] на [number]. + reset: Сброшен максимальный размер команды [name] + для [prefix_island] до мирового значения по умолчанию ([number]). range: description: команда администратора по управлению областью острова invalid-value: - too-low: 'Радиус острова должен быть больше 1!' - too-high: 'Радиус острова должен быть равен или меньше чем [number]!' - same-as-before: 'Радиус острова уже установлен в значении [number]!' + too-low: Радиус острова должен быть больше 1! + too-high: Радиус острова должен быть равен или меньше чем [number]! + same-as-before: Радиус острова уже установлен в значении [number]! display: - already-off: 'Индикаторы уже выключены' - already-on: 'Индикаторы уже включены' + already-off: Индикаторы уже выключены + already-on: Индикаторы уже включены description: показать/скрыть индикаторы размера острова - hiding: 'Скрыть индикаторы размера острова' - hint: >- + hiding: Скрыть индикаторы размера острова + hint: |- Красные иконки барьера показывают текущую границу острова. - Серые частицы показывают максимально возможную область. - - Зеленые частицы показывают границу по умолчанию, если текущая - область отличается от таковой. - showing: 'Отображение индикаторов области' + Зеленые частицы показывают границу по умолчанию, если текущая область отличается от таковой. + showing: Отображение индикаторов области set: parameters: description: устанавливает радиус острова - success: 'Установлен радиус острова [number].' + success: Установлен радиус острова [number]. reset: parameters: <игрок> description: сбрасывает радиус острова до значения по умолчанию - success: 'Радиус острова сброшен до значения [number].' + success: Радиус острова сброшен до значения [number]. add: description: увеличивает радиус острова parameters: - success: >- - Радиус острова игрока [name] успешно увеличен до значения - [total] (+[number]). + success: Радиус острова игрока [name] успешно + увеличен до значения [total] (+[number]). remove: description: уменьшает радиус острова parameters: - success: >- - Радиус острова игрока [name] успешно уменьшен до значения - [total] (-[number]). + success: Радиус острова игрока [name] успешно + уменьшен до значения [total] (-[number]). register: parameters: <игрок> description: регистрирует игрока на острове без владельца, на котором вы находитесь - registered-island: >- - Игрок [name] зарегистрирован на острове, находящемся на координатах - [xyz]. - reserved-island: 'Остров на координатах [xyz] зарезервирован для [name].' - already-owned: 'Остров уже принадлежит другому игроку!' - no-island-here: 'Здесь нет острова. Подтвердите для создания острова.' - in-deletion: 'Это пространство для острова уже было удалено. Попробуйте позднее.' - cannot-make-island: >- - Остров не может быть размещен здесь, извините. Посмотрите в консоль за - возможными ошибками. - island-is-spawn: >- - Остров является спавном. Вы уверены? Введите команду снова для - подтверждения. + registered-island: Игрок [name] зарегистрирован на острове, находящемся + на координатах [xyz]. + reserved-island: Остров на координатах [xyz] зарезервирован для [name]. + already-owned: Остров уже принадлежит другому игроку! + no-island-here: Здесь нет острова. Подтвердите для создания острова. + in-deletion: Это пространство для острова уже было удалено. Попробуйте + позднее. + cannot-make-island: Остров не может быть размещён здесь, извините. Посмотрите + в консоль за возможными ошибками. + island-is-spawn: Остров является спавном. Вы уверены? Введите команду + снова для подтверждения. unregister: parameters: <владелец> [x,y,z] description: разрегистрирует остров, но сохраняет блоки на острове - unregistered-island: 'Игрок [name] разрегистрирован с острова на координатах [xyz].' + unregistered-island: Игрок [name] разрегистрирован с острова на координатах + [xyz]. errors: - unknown-island-location: 'Неизвестная [prefix_island] локация' - specify-island-location: 'Укажите местоположение [prefix_island] в формате x,y,z' - player-has-more-than-one-island: 'Игрок имеет более одного [prefix_island]. Укажите, какой именно.' + unknown-island-location: Неизвестная [prefix_island] локация + specify-island-location: Укажите местоположение [prefix_island] в формате + x,y,z + player-has-more-than-one-island: Игрок имеет более одного [prefix_island]. + Укажите, какой именно. info: parameters: <игрок> description: получите информацию где вы или на чьем вы острове - no-island: 'Вы не на острове в данный момент...' - title: '========== Информация об острове ============' + no-island: Вы не на острове в данный момент... + title: ========== Информация об острове ============ island-uuid: 'UUID: [uuid]' owner: 'Владелец: [owner] ([uuid])' last-login: 'Последний вход: [date]' @@ -267,175 +271,169 @@ commands: resets-left: 'Сбросов: [number] (Максимум: [total])' max-homes: 'Максимальное количество домов: [number]' team-members-title: 'Состав команды:' - team-owner-format: '[name] [rank]' - team-member-format: '[name] [rank]' + team-owner-format: [name] [rank] + team-member-format: [name] [rank] max-team-size: 'Максимальный размер команды: [number]' max-coop-size: 'Максимальный размер кооперации: [number]' max-trusted-size: 'Максимальный размер доверенных: [number]' island-protection-center: 'Центр острова: [xyz]' island-center: 'Центр острова: [xyz]' island-coords: 'Координаты острова: от [xz1] до [xz2]' - islands-in-trash: 'Игрок имеет остров в мусоре.' + islands-in-trash: Игрок имеет остров в мусоре. protection-range: 'Радиус острова: [range]' - protection-range-bonus-title: 'Включая указанный бонус:' + protection-range-bonus-title: Включая указанный бонус: protection-range-bonus: 'Бонус: [number]' purge-protected: Остров защищен от очистки max-protection-range: 'Самый большой радиус острова за все время: [range]' protection-coords: 'Радиус границ острова: от [xz1] до [xz2]' is-spawn: Остров является точкой спавна banned-players: 'Забаненные игроки:' - banned-format: '[name]' - unowned: 'Не владелец' + banned-format: [name] + unowned: Не владелец bundle: 'Пакет чертежей, использованный для создания острова: [name]' switch: description: переключатель вкл/выкл обхода защиты - op: >- - Операторы сервера всегда имеют обход защиты. Снимите себя с - операторства и повторите снова. - removing: 'Убираем защиту от обхода...' - adding: 'Добавляем защиту от обхода...' + op: Операторы сервера всегда имеют обход защиты. Снимите себя с операторства + и повторите снова. + removing: Убираем защиту от обхода... + adding: Добавляем защиту от обхода... switchto: parameters: <игрок> <число> description: причисляет остров игрока к мусорным островам - out-of-range: >- - Номер должен быть между 1 и [number]. Используйте [label] trash - [player] для просмотра значений. - cannot-switch: 'Переключение не удалось. Смотрите логи в консоли для поиска ошибки.' - success: 'Остров игрока успешно переключен в режим мусорного.' + out-of-range: Номер должен быть между 1 и [number]. Используйте [label] + trash [player] для просмотра значений. + cannot-switch: Переключение не удалось. Смотрите логи в консоли для поиска + ошибки. + success: Остров игрока успешно переключен в режим мусорного. trash: - no-unowned-in-trash: 'В мусорке нет островов без владельца' - no-islands-in-trash: 'Игрок не имеет островов в мусорке' + no-unowned-in-trash: В мусорке нет островов без владельца + no-islands-in-trash: Игрок не имеет островов в мусорке parameters: '[игрок]' description: показывает острова без владельца и мусорные острова - title: '=========== Мусорные острова ===========' - count: 'Остров [number]:' - use-switch: >- - Используйте [label] switchto для переключения - к острову игрока - use-emptytrash: >- - Используйте [label] emptytrash [player]для постоянного - удаления мусорных предметов + title: =========== Мусорные острова =========== + count: Остров [number]: + use-switch: Используйте [label] switchto для + переключения к острову игрока + use-emptytrash: Используйте [label] emptytrash [player]для + постоянного удаления мусорных предметов emptytrash: parameters: '[игрок]' description: Очистить мусор для игрока или все незащищенные острова в мусоре - success: 'Мусор успешно опустошен.' + success: Мусор успешно опустошен. version: description: отображает версию BentoBox и дополнений к нему setrange: parameters: <игрок> <диапазон> description: устанавливает радиус острова игрока - range-updated: 'Радиус острова игрока обновлен до значения [number] .' + range-updated: Радиус острова игрока обновлен до значения [number] + . placeholders: description: открыть браузер заполнителей dump-placeholders: description: экспортировать все зарегистрированные заполнители в markdown файл - dumped: 'Список заполнителей записан в [file]' + dumped: Список заполнителей записан в [file] error: 'Не удалось записать список заполнителей: [message]' reload: description: перезагрузка tp: parameters: [player to teleport] description: телепорт на остров игрока - manual: >- - Безопасная точка телепортации не обнаружена! Вручную телепортируйтесь + manual: Безопасная точка телепортации не обнаружена! Вручную телепортируйтесь рядом с [location] и проверьте обстановку tpuser: - parameters: <телепортирующийся игрок> <[prefix_island]'s игрок> [остров игрока] + parameters: <телепортирующийся игрок> <[prefix_island] игрока> [остров игрока] description: телепортировать игрока на [prefix_island] другого игрока getrank: parameters: [island owner] description: отображает ранг игрока на его острове или острове владельца - rank-is: 'Ранг [rank] на острове игрока [name].' + rank-is: Ранг [rank] на острове игрока [name]. setrank: parameters: [island owner] description: устанавливает ранг игрока на их острове или острове владельца - unknown-rank: 'Неизвестный ранг!' - not-possible: 'Ранг должен быть больше чем у посетителя.' - rank-set: >- - Ранг установлен между [from] и [to] на острове игрока - [name]. + unknown-rank: Неизвестный ранг! + not-possible: Ранг должен быть больше чем у посетителя. + rank-set: Ранг установлен между [from] и + [to] на острове игрока [name]. setprotectionlocation: parameters: '[x y z coords]' - description: >- - устанавливает текущую локацию или координаты [x y z] как центральную + description: устанавливает текущую локацию или координаты [x y z] как центральную точку острова - island: >- - Это повлияет на остров игрока [name], находящийся на координатах + island: Это повлияет на остров игрока [name], находящийся на координатах [xyz]. - confirmation: 'Вы уверены, что хотите установить [xyz] как центр острова?' - success: 'Успешно установлено [xyz] как центр острова.' - fail: 'Не удалось установить [xyz] как центр острова.' - island-location-changed: '[user] изменил радиус острова на координаты [xyz].' + confirmation: Вы уверены, что хотите установить [xyz] как центр острова? + success: Успешно установлено [xyz] как центр острова. + fail: Не удалось установить [xyz] как центр острова. + island-location-changed: [user] изменил радиус острова на координаты + [xyz]. xyz-error: 'Укажите 3 целых значения: например, 100 120 100' setspawn: description: устанавливает остров в качестве спавна в данном игровом режиме - already-spawn: 'Этот остров уже является спавном!' - no-island-here: 'Здесь нет острова.' - confirmation: 'Вы уверены, что хотите установить этот остров как спавн в этом режиме?' - success: 'Остров успешно установлен в качестве спавна в этом мире.' + already-spawn: Этот остров уже является спавном! + no-island-here: Здесь нет острова. + confirmation: Вы уверены, что хотите установить этот остров как спавн в + этом режиме? + success: Остров успешно установлен в качестве спавна в этом мире. setspawnpoint: description: устанавливает текущую точку как точку спавна на указанном острове - no-island-here: 'Здесь нет острова.' - confirmation: >- - Вы уверен, что хотите сделать текущую точку как точку спавна на - указанном острове? - success: 'Точка спавна на данном острове успешно установлена.' - island-spawnpoint-changed: '[user] изменил точку спавна на своем острове.' + no-island-here: Здесь нет острова. + confirmation: Вы уверен, что хотите сделать текущую точку как точку спавна + на указанном острове? + success: Точка спавна на данном острове успешно установлена. + island-spawnpoint-changed: [user] изменил точку спавна на своем острове. settings: - parameters: >- - [игрок]/[флаг мира]/спавн-остров [флаг/активировать/отключить] - [ранг/активировать/отключить] + parameters: '[игрок]/[флаг мира]/спавн-остров [флаг/активировать/отключить] + [ранг/активировать/отключить]' description: открывает окно настроек или выводит список - unknown-setting: 'Неизвестная настройка' + unknown-setting: Неизвестная настройка blueprint: parameters: description: взаимодействие с планами - bedrock-required: 'Как минимум 1 блок бедрока должен быть в плане!' - copy-first: 'Сначала скопируйте!' - file-exists: 'Файл уже существует, перезаписать?' - no-such-file: 'Нет нужного файла!' - could-not-load: 'Не удалось загрузить файл!' + bedrock-required: Как минимум 1 блок бедрока должен быть в плане! + copy-first: Сначала скопируйте! + file-exists: Файл уже существует, перезаписать? + no-such-file: Нет нужного файла! + could-not-load: Не удалось загрузить файл! could-not-save: 'Хмм, что-то пошло не так при сохранении файла: [message]' - set-pos1: 'Позиция 1 установлена как [vector]' - set-pos2: 'Позиция 2 установлена как [vector]' - set-different-pos: 'Установите иную позицию - эта позиция уже установлена!' - need-pos1-pos2: 'Установите pos1 и pos2 сначала!' - copying: 'Копируем блоки...' - copied-blocks: 'Скопировано [number] блоков в буфер обмена' - look-at-a-block: 'Посмотрите на блок в пределах 20 блоков, чтобы установить' - mid-copy: 'Вы в режиме копирования. Подождите ее окончания.' - copied-percent: 'Скопировано [number]%' + set-pos1: Позиция 1 установлена как [vector] + set-pos2: Позиция 2 установлена как [vector] + set-different-pos: Установите иную позицию - эта позиция уже установлена! + need-pos1-pos2: Установите pos1 и pos2 сначала! + copying: Копируем блоки... + copied-blocks: Скопировано [number] блоков в буфер обмена + look-at-a-block: Посмотрите на блок в пределах 20 блоков, чтобы установить + mid-copy: Вы в режиме копирования. Подождите ее окончания. + copied-percent: Скопировано [number]% copy: parameters: '[air]' - description: >- - скопируйте в буфер обмена установленные pos1, pos2 и, возможно, блоки - возлуха + description: скопируйте в буфер обмена установленные pos1, pos2 и, возможно, + блоки возлуха sink: - description: установите этот чертеж, чтобы он опустился на дно океана после вставки - status: 'Чертеж будет [status] при вставке' - sink: 'погружаться на дно' - not-sink: 'не погружаться' - no-clipboard: 'В буфере обмена нет чертежа. Загрузите или скопируйте что-нибудь.' + description: установите этот чертеж, чтобы он опустился на дно океана после + вставки + status: Чертеж будет [status] при вставке + sink: погружаться на дно + not-sink: не погружаться + no-clipboard: В буфере обмена нет чертежа. Загрузите или скопируйте что-нибудь. delete: parameters: description: удалить план - no-blueprint: '[name] не существует.' - confirmation: | + no-blueprint: [name] не существует. + confirmation: |- Вы уверены, что хотите удалить этот план? После удаления нет возможности восстановить. - success: 'План [name] успешно удален.' + success: План [name] успешно удален. load: parameters: <имя> description: загрузить план в буфер обмена list: description: список доступных планов - no-blueprints: 'В папке планов сами планы отсутствуют!' - available-blueprints: 'Указанные планы доступны для загрузки:' + no-blueprints: В папке планов сами планы отсутствуют! + available-blueprints: Указанные планы доступны для загрузки: origin: description: установите источник плана в свою позицию paste: description: вставьте буфер обмена в свое местоположение - pasting: 'Вставляем...' + pasting: Вставляем... pos1: description: установить 1-й угол кубоида в буфере обмена pos2: @@ -446,10 +444,11 @@ commands: rename: parameters: <синий план> <новое имя> description: переименовать план - success: >- - План [old] был успешно переименован в [display]. Название - файла теперь [name] . - pick-different-name: 'Укажите имя, отличное от имени уже существующего плана.' + success: План [old] был успешно переименован + в [display]. Название файла теперь [name] + . + pick-different-name: Укажите имя, отличное от имени уже существующего + плана. management: back: Назад instruction: Нажмите на план, затем кликните сюда. @@ -458,7 +457,7 @@ commands: rename: Правый клик для переименования edit-description: Нажмите для редактирования описания world-name-syntax: '[name] мир' - world-instructions: | + world-instructions: |- Установите план правильно для установки trash: Мусор @@ -470,9 +469,9 @@ commands: perm-required: Требуется no-perm-required: Невозможно установить разрешения для сборника по умолчанию perm-not-required: Не требуется - perm-format: '' + perm-format: remove: Правый клик для удаления - blueprint-instruction: | + blueprint-instruction: |- Нажмите для выбора, затем добавьте в сборника. Правый клик для переименования. @@ -482,46 +481,45 @@ commands: name: quit: выход prompt: Введите имя, или 'quit' для выхода - too-long: 'Слишком длинное имя. Установить можно до 32 знаков.' + too-long: Слишком длинное имя. Установить можно до 32 знаков. pick-a-unique-name: Пожалуйста, выберите более уникальное имя. - stripped-char-in-unique-name: >- - Некоторые недопустимые символы удалены. Новый ID будет [name] - . + stripped-char-in-unique-name: Некоторые недопустимые символы удалены. + Новый ID будет [name] . success: Успех! conversation-prefix: '>' description: quit: выход - instructions: | + instructions: |- введите многострочное описание для [name] и 'quit' на линии, чтобы закончить. default-color: '' success: Успех! cancelling: Отмена - slot: 'Предпочтительный слот [number]' - slot-instructions: | - Щелкните левой кнопкой мыши, чтобы увеличить - Щелкните правой кнопкой мыши, чтобы уменьшить + slot: Предпочтительный слот [number] + slot-instructions: |- + ЛКМ, чтобы увеличить + ПКМ, чтобы уменьшить times: |- Макс. одновременные использования игроком - Левый клик для увеличения - Правый клик для уменьшения + ЛКМ для увеличения + ПКМ для уменьшения unlimited-times: Неограниченно maximum-times: Максимум [number] раз - cost: | + cost: |- Стоимость [prefix_Island] ЛКМ +1 ПКМ -1 Shift для +/-100 no-cost: Бесплатно cost-amount: 'Стоимость: [cost]' - next-page: 'Следующая страница' - previous-page: 'Предыдущая страница' + next-page: Следующая страница + previous-page: Предыдущая страница edit-commands: Нажмите для редактирования команд no-commands: Команды не установлены commands: quit: выход clear: очистить - instructions: | + instructions: |- Введите команды для выполнения при вставке чертежа [name]. Поддерживает заполнители [player] и [owner]. Добавьте [SUDO] для выполнения от имени игрока. @@ -532,55 +530,53 @@ commands: cancelling: Отмена resetflags: parameters: '[флаг]' - description: >- - Сбрасывает все настройки флагов на всех островах до значений по + description: Сбрасывает все настройки флагов на всех островах до значений по умолчанию из файла config.yml - confirm: 'Это сбросит флаги до значений по умолчанию на всех островах!' - success: 'Флаги успешно сброшены до значений по умолчанию на всех островах.' - success-one: 'Флаг [name] сброшен до значения по умолчанию на всех островах.' + confirm: Это сбросит флаги до значений по умолчанию на всех островах! + success: Флаги успешно сброшены до значений по умолчанию на всех островах. + success-one: Флаг [name] сброшен до значения по умолчанию на всех островах. world: description: управление настройками мира delete: parameters: <игрок> description: удаление острова игрока - cannot-delete-owner: 'Все участники острова будут изгнаны перед удалением.' - deleted-island: 'Остров на координатах [xyz] успешно удален.' + cannot-delete-owner: Все участники острова будут изгнаны перед удалением. + deleted-island: Остров на координатах [xyz] успешно + удален. deletehomes: parameters: <игрок> description: удаляет все установленные точки дома на острове - warning: 'Все точки дома удалены с острова!' + warning: Все точки дома удалены с острова! why: parameters: <игрок> description: включить отчет об отладке защиты консоли - turning-on: 'Включен режим отладки в консоли для [name].' - turning-off: 'Выключен режим отладки в консоли для [name].' + turning-on: Включен режим отладки в консоли для [name]. + turning-off: Выключен режим отладки в консоли для [name]. deaths: description: редактирует количество смертей у игроков reset: description: сбрасывает количество смертей игрока parameters: <игрок> - success: 'Успешно сброшено количество смертей игрока [name] до 0.' + success: Успешно сброшено количество смертей игрока [name] + до 0. set: description: устанавливает количество смертей у игрока parameters: <игрок> <смерти> - success: >- - Успешно установлено количество смертей игрока [name]на значение - [number] . + success: Успешно установлено количество смертей игрока [name]на + значение [number] . add: description: добавляет смерти игроку parameters: <игрок> <смерти> - success: >- - [number] смертей успешно добавлено игроку [name], увеличив общее - количество до [total] смертей. + success: [number] смертей успешно добавлено игроку [name], + увеличив общее количество до [total] смертей. remove: description: убрать смерти у игрока parameters: <игрок> <смерти> - success: >- - [number] смертей успешно убрано у игрока [name], уменьшив общее - количество до [total] смертей. + success: [number] смертей успешно убрано у игрока [name], + уменьшив общее количество до [total] смертей. resetname: description: сбрасывает название острова игрока - success: 'Успешно сброшено имя острова [name].' + success: Успешно сброшено имя острова [name]. bentobox: description: BentoBox команды администратора perms: @@ -591,7 +587,7 @@ commands: description: открыть браузер заполнителей dump-placeholders: description: экспортировать все зарегистрированные заполнители в markdown файл - dumped: 'Список заполнителей записан в [file]' + dumped: Список заполнителей записан в [file] error: 'Не удалось записать список заполнителей: [message]' reload: description: перезагружает BentoBox и все аддоны, настройки и файлы локализации @@ -600,10 +596,7 @@ commands: settings-reloaded: '[prefix_bentobox]Настройки перезагружены.' addon: '[prefix_bentobox]Перезагрузка [name].' addon-reloaded: '[prefix_bentobox][name] перезагружен.' - warning: >- - [prefix_bentobox]Предупреждение: Перезагрузка может привести к - нестабильной работе, так что если вы видите ошибки - перезагрузите - сервер. + warning: '[prefix_bentobox]Предупреждение: Перезагрузка может привести к нестабильной работе, так что если вы видите ошибки - перезагрузите сервер.' unknown-addon: '[prefix_bentobox]неизвестный аддон!' locales: description: перезагрузка файлов локализации @@ -612,9 +605,10 @@ commands: description: отображает версию BentoBox и дополнений loaded-addons: 'Загруженные аддоны:' loaded-game-worlds: 'Загруженные миры:' - addon-syntax: '[name] [version] ([state])' - game-world: '[name] ([addon]): [worlds]' - server: 'Запущено [name] [version].' + addon-syntax: [name] [version] ([state]) + game-world: '[name] ([addon]): + [worlds]' + server: Запущено [name] [version]. database: 'База данных: [database]' manage: description: отображает панель управления @@ -622,11 +616,9 @@ commands: description: отображает каталог locale: description: выполняет анализ файлов локализации - see-console: >- + see-console: |- [prefix_bentobox]Проверьте консоль для получения обратной связи. - - [prefix_bentobox]Эта команда так много спамит, что нельзя получить - ответ в чате... + [prefix_bentobox]Эта команда так много спамит, что нельзя получить ответ в чате... migrate: description: мигрирует базу данных из одного места в другое players: '[prefix_bentobox]Миграция игроков' @@ -637,70 +629,69 @@ commands: completed: '[prefix_bentobox]Завершено' rank: description: список, добавить или удалить ранги - parameters: '[list | add | remove] [ссылка на ранг] [значение ранга]' + parameters: [list | add | remove] [ссылка на ранг] [значение ранга] add: - success: 'Добавлено [rank] со значением [number]' - failure: >- - Не удалось добавить [rank] со значением [number]. Возможно, + success: Добавлено [rank] со значением [number] + failure: Не удалось добавить [rank] со значением [number]. Возможно, дубликат? remove: - success: 'Удалено [rank]' - failure: 'Не удалось удалить [rank]. Неизвестный ранг.' - list: 'Зарегистрированные ранги следующие:' + success: Удалено [rank] + failure: Не удалось удалить [rank]. Неизвестный ранг. + list: Зарегистрированные ранги следующие: confirmation: - confirm: 'Введите команду снова в течение [seconds] секунд для подтверждения.' - previous-request-cancelled: 'Предыдущий запрос на подтверждение был отменён.' - request-cancelled: 'Время подтверждения истекло - запрос отменён.' + confirm: Введите команду снова в течение [seconds] секунд для подтверждения. + previous-request-cancelled: Предыдущий запрос на подтверждение был отменён. + request-cancelled: Время подтверждения истекло - запрос отменён. delay: - previous-command-cancelled: 'Предыдущая команда была отменена' - stand-still: 'Не двигайтесь! Телепортация через [seconds] секунды' - moved-so-command-cancelled: 'Вы сдвинулись. Телепортация отменена!' + previous-command-cancelled: Предыдущая команда была отменена + stand-still: Не двигайтесь! Телепортация через [seconds] секунды + moved-so-command-cancelled: Вы сдвинулись. Телепортация отменена! island: about: description: показать сведения о лицензии go: parameters: '[дом имя]' description: телепортация на свой остров - teleport: 'Телепортируемся на ваш остров.' - in-progress: 'Телепортация в процессе, пожалуйста, подождите...' - teleported: 'Вы успешно телепортировали на точку дома [number].' - failure: >- - Телепортация не удалась по какой-то причине. Пожалуйста, попробуйте + teleport: Телепортируемся на ваш остров. + in-progress: Телепортация в процессе, пожалуйста, подождите... + teleported: Вы успешно телепортировали на точку дома [number]. + failure: Телепортация не удалась по какой-то причине. Пожалуйста, попробуйте снова позже. - unknown-home: 'Неизвестное название точки дома!' + unknown-home: Неизвестное название точки дома! help: description: основная команда режима spawn: description: телепортация на спавн - teleporting: 'Телепортируемся на спавн.' - no-spawn: 'В этом режиме игры нет спавна.' + teleporting: Телепортируемся на спавн. + no-spawn: В этом режиме игры нет спавна. create: description: создайте остров, используя специальный план (требуется разрешение) parameters: <синий план> - too-many-islands: >- - В этом мире слишком много островов: здесь нет места для создания - вашего острова. - cannot-create-island: 'Место не найдено в данный момент, попробуйте еще раз позднее...' - unable-create-island: 'Ваш остров не был создан, свяжитесь с администрацией.' - creating-island: 'Поиск места для создания острова...' - you-cannot-make: 'Вы не можете создать больше островов!' - max-uses: 'Вы не можете создать больше такого типа [prefix_island]!' - you-cannot-make-team: >- - Участники команды не могут создавать острова в том же мире, что и их - команда [prefix_island]. + too-many-islands: 'В этом мире слишком много островов: здесь нет места + для создания вашего острова.' + cannot-create-island: Место не найдено в данный момент, попробуйте ещё + раз позднее... + unable-create-island: Ваш остров не был создан, свяжитесь с администрацией. + creating-island: Поиск места для создания острова... + you-cannot-make: Вы не можете создать больше островов! + max-uses: Вы не можете создать больше такого типа [prefix_island]! + you-cannot-make-team: Участники команды не могут создавать острова в том + же мире, что и их команда [prefix_island]. pasting: estimated-time: 'Расчетное время: [number] секунд.' - blocks: 'Строим блок за блоком: [number] блоков всего...' - entities: 'Наполняем сущностями: [number] сущностей всего...' - dimension-done: 'Остров в [world] построен.' - done: 'Готово! Ваш остров готов и ожидает вас!' - pick: 'Выберите остров' + blocks: 'Строим блок за блоком: [number] блоков + всего...' + entities: 'Наполняем сущностями: [number] сущностей + всего...' + dimension-done: Остров в [world] построен. + done: Готово! Ваш остров готов и ожидает вас! + pick: Выберите остров cannot-afford: 'Вы не можете себе это позволить! Стоимость: [cost]' - unknown-blueprint: 'Этот план еще не был загружен.' - on-first-login: >- - Добро пожаловать! Мы начнём готовить ваш остров через несколько - секунд. - you-can-teleport-to-your-island: 'Вы можете телепортироваться на остров когда вам будет угодно.' + unknown-blueprint: Этот план ещё не был загружен. + on-first-login: Добро пожаловать! Мы начнём готовить ваш остров через + несколько секунд. + you-can-teleport-to-your-island: Вы можете телепортироваться на остров + когда вам будет угодно. deletehome: description: удалить точку дома parameters: '[название дома]' @@ -712,61 +703,55 @@ commands: near: description: показывает название островов, находящихся рядом с вами parameters: '' - the-following-islands: 'Следующие острова неподалеку:' + the-following-islands: Следующие острова неподалеку: syntax: '[direction]: [name]' north: Север south: Юг east: Восток west: Запад - no-neighbors: 'Островов поблизости не обнаружено!' + no-neighbors: Островов поблизости не обнаружено! reset: description: удаляет старый остров и дает новый parameters: <чертеж> - none-left: 'У вас больше не осталось сбросов!' - resets-left: 'У вас осталось [number] сбросов' - confirmation: >- + none-left: У вас больше не осталось сбросов! + resets-left: У вас осталось [number] сбросов + confirmation: |- Вы уверены, что хотите сделать это? - - Все участники будут удалены с острова, вам будет необходимо - пригласить их заново. - - Здесь нет пути назад: после удаления острова, у вас НЕ БУДЕТ - возможности восстановить его. - kicked-from-island: >- - Вы были удалены с острова в режиме [gamemode], так как владелец - сбросил его. + Все участники будут удалены с острова, вам будет необходимо пригласить их заново. + Здесь нет пути назад: после удаления острова, у вас НЕ БУДЕТ возможности восстановить его. + kicked-from-island: Вы были удалены с острова в режиме [gamemode], так + как владелец сбросил его. sethome: description: устанавливает точку телепортации дома - must-be-on-your-island: 'Вы должны быть на своем острове для установки этого!' - too-many-homes: >- - Невозможно установить - вы достигли максимального количества + must-be-on-your-island: Вы должны быть на своем острове для установки этого! + too-many-homes: Невозможно установить - вы достигли максимального количества ([number]) точек дома. - home-set: 'Ваше местоположение на острове установлено как точка дома.' - homes-are: 'Точки дома на острове:' - home-list-syntax: '[name]' - click-to-teleport: 'Нажмите для телепортации!' + home-set: Ваше местоположение на острове установлено как точка дома. + homes-are: Точки дома на острове: + home-list-syntax: [name] + click-to-teleport: Нажмите для телепортации! nether: - not-allowed: 'Запрещено устанавливать точки дома в Незере.' - confirmation: 'Вы уверены, что хотите установить точку дома в Незере?' + not-allowed: Запрещено устанавливать точки дома в Незере. + confirmation: Вы уверены, что хотите установить точку дома в Незере? the-end: - not-allowed: 'Вам не разрешено устанавливать точку дома в Энд.' - confirmation: 'Вы уверены, что хотите установить свой дом в Энде?' + not-allowed: Вам не разрешено устанавливать точку дома в Энд. + confirmation: Вы уверены, что хотите установить свой дом в Энде? parameters: '[имя дома]' setname: description: устанавливает название вашего острова - name-too-short: 'Слишком коротко. Минимальная длина [number] символов.' - name-too-long: 'Слишком много символов. Максимальная длина [number] символов.' - name-already-exists: 'В этом игровом режиме уже есть остров с таким названием.' + name-too-short: Слишком коротко. Минимальная длина [number] символов. + name-too-long: Слишком много символов. Максимальная длина [number] символов. + name-already-exists: В этом игровом режиме уже есть остров с таким названием. parameters: <имя> - success: 'Ваше название острова успешно установлено как [name].' + success: Ваше название острова успешно установлено как [name]. renamehome: description: переименовывает точку дома parameters: '[имя дома]' - enter-new-name: 'Введите новое имя' - already-exists: 'Это имя уже существует, попробуйте иное.' + enter-new-name: Введите новое имя + already-exists: Это имя уже существует, попробуйте иное. resetname: description: сбрасывает имя острова - success: 'Название вашего острова успешно сброшено.' + success: Название вашего острова успешно сброшено. team: description: управляет командой gui: @@ -778,7 +763,7 @@ commands: description: Статус команды rank-filter: name: Фильтр по рангу - description: 'Нажмите, чтобы сменить ранг' + description: Нажмите, чтобы сменить ранг invitation: Приглашение invite: name: Пригласить игрока @@ -788,228 +773,231 @@ commands: отображаться в списке. tips: LEFT: - name: 'Левый клик' - invite: 'пригласить игрока' + name: ЛКМ + invite: пригласить игрока RIGHT: - name: 'Щелкните правой кнопкой мыши' + name: ПКМ SHIFT_RIGHT: - name: 'Сдвиг + Правая кнопка мыши' - reject: 'для отклонения' - kick: 'для кика игрока' - leave: 'покинуть команду' + name: Shift + ПКМ + reject: для отклонения + kick: для кика игрока + leave: покинуть команду SHIFT_LEFT: - name: 'Левый Shift Клик' - accept: 'для принятия' + name: Shift + ЛКМ + accept: для принятия setowner: |- установить владельца к этому игроку info: description: отображает подробную информацию о вашей команде member-layout: - online: ' о [name]' - offline: ' o [name] ([last_seen])' - offline-not-last-seen: ' o [name]' + online: о [name] + offline: o [name] ([last_seen]) + offline-not-last-seen: o [name] last-seen: - layout: '[number] [unit]' + layout: [number] [unit] days: дней hours: часов minutes: минут - header: | + header: |- --- Информация о команде --- Участники: [total]/[max] - Онлайн участники: [online] + Онлайн: [online] rank-layout: - owner: '[rank]:' - generic: '[rank] ([number]):' + owner: [rank]: + generic: [rank] ([number]): coop: description: создать кооперацию игроков на острове parameters: <игрок> - cannot-coop-yourself: 'Вы не можете быть командой с собой!' - already-has-rank: 'Игрок уже имеет этот ранг!' - you-are-a-coop-member: 'Вы уже скооперированы с [name].' - success: 'Вы скооперированы с [name].' - name-has-invited-you: '[name] пригласил вас присоединиться к команде на его острове.' + cannot-coop-yourself: Вы не можете быть командой с собой! + already-has-rank: Игрок уже имеет этот ранг! + you-are-a-coop-member: Вы уже скооперированы с [name]. + success: Вы скооперированы с [name]. + name-has-invited-you: [name] пригласил вас присоединиться к команде + на его острове. uncoop: description: убирает кооперацию игроков на острове parameters: <игрок> - cannot-uncoop-yourself: 'Вы не можете расфирмовать команду из самого себя!' - cannot-uncoop-member: 'Вы не можете раскооперировать участника!' - player-not-cooped: 'Игрок не скооперирован!' - you-are-no-longer-a-coop-member: 'Вы больше не в кооперации игроков на острове игрока [name]' - all-members-logged-off: >- - Все участники острова вышли из сети, так что вы больше не - находитесь в кооперации на острове игрока [name]. - success: '[name] больше не является участником кооперации на вашем острове.' - is-full: 'Вы не можете больше добавлять в кооперацию.' + cannot-uncoop-yourself: Вы не можете расфирмовать команду из самого себя! + cannot-uncoop-member: Вы не можете раскооперировать участника! + player-not-cooped: Игрок не скооперирован! + you-are-no-longer-a-coop-member: Вы больше не в кооперации игроков на + острове игрока [name] + all-members-logged-off: Все участники острова вышли из сети, так что + вы больше не находитесь в кооперации на острове игрока [name]. + success: [name] больше не является участником кооперации + на вашем острове. + is-full: Вы не можете больше добавлять в кооперацию. trust: description: сделать игрока доверенным на острове parameters: <игрок> - trust-in-yourself: 'Поверьте в себя!' - name-has-invited-you: '[name] пригласил вас стать довереннным игроком на его острове.' - player-already-trusted: 'Игрок уже доверенный!' - you-are-trusted: 'Игрок [name] сделал вас доверенным!' - success: 'Вы сделали игрока [name] доверенным.' - is-full: 'Вы не можете доверять еще кому-либо, лимит достигнут!' + trust-in-yourself: Поверьте в себя! + name-has-invited-you: [name] пригласил вас стать довереннным игроком + на его острове. + player-already-trusted: Игрок уже доверенный! + you-are-trusted: Игрок [name] сделал + вас доверенным! + success: Вы сделали игрока [name] доверенным. + is-full: Вы не можете доверять ещё кому-либо, лимит достигнут! untrust: description: убрать статус доверенного игрока parameters: <игрок> - cannot-untrust-yourself: 'Вы не можете перестать верить в себя!' - cannot-untrust-member: 'Вы не можете раздоверить участника' - player-not-trusted: 'Игрок больше не доверенный!' - you-are-no-longer-trusted: 'Вы больше не являетесь доверенным игроком у [name] !' - success: '[name] больше не является доверенным на вашему острове.' + cannot-untrust-yourself: Вы не можете перестать верить в себя! + cannot-untrust-member: Вы не можете раздоверить участника + player-not-trusted: Игрок больше не доверенный! + you-are-no-longer-trusted: Вы больше не являетесь доверенным игроком + у [name] ! + success: [name] больше не является доверенным на вашему + острове. invite: description: приглашает игрока посетить ваш остров - invitation-sent: 'Приглашение отправлено игроку [name].' - removing-invite: 'Удаление приглашения.' - name-has-invited-you: '[name] пригласил вас посетить его остров.' - to-accept-or-reject: >- - Введите /[label] team accept чтобы принять либо /[label] team reject - для отказа - you-will-lose-your-island: >- - ВНИМАНИЕ! Вы ПОТЕРЯЕТЕ ваш остров (вместе с инвентарем) в случае - принятия! + invitation-sent: Приглашение отправлено игроку [name]. + removing-invite: Удаление приглашения. + name-has-invited-you: [name] пригласил вас посетить его остров. + to-accept-or-reject: Введите /[label] team accept чтобы принять либо + /[label] team reject для отказа + you-will-lose-your-island: ВНИМАНИЕ! Вы ПОТЕРЯЕТЕ ваш остров (вместе + с инвентарем) в случае принятия! gui: titles: team-invite-panel: Пригласить игроков button: - already-invited: 'Приглашен уже' - search: 'Найти игрока' + already-invited: Приглашен уже + search: Найти игрока searching: |- Поиск за [name] - enter-name: 'Введите имя:' + enter-name: Введите имя: tips: LEFT: - name: 'Левый Клик' - search: 'Введите имя игрока' - back: 'Назад' + name: ЛКМ + search: Введите имя игрока + back: Назад invite: |- , чтобы пригласить игрока , чтобы присоединиться к вашей команде RIGHT: - name: 'Правая кнопка мыши' - coop: 'к совместной игре с игроком' + name: ПКМ + coop: к совместной игре с игроком SHIFT_LEFT: - name: 'Сдвиньте Левую Кнопку Мыши' - trust: 'доверять игроку' + name: Shift + ЛКМ + trust: доверять игроку errors: - cannot-invite-self: 'Вы не можете пригласить самого себя!' - cooldown: 'Вы не можете пригласить этого игрока в течение [number] секунд.' - island-is-full: 'Ваш остров полон, вы не можете больше никого пригласить.' - none-invited-you: 'Вас никто не пригласил :c.' - you-already-are-in-team: 'Вы уже в команде!' - already-on-team: 'Этот игрок уже в команде!' - invalid-invite: 'Приглашение больше не действует, извините.' - you-have-already-invited: 'Вы уже пригласили этого игрока!' + cannot-invite-self: Вы не можете пригласить самого себя! + cooldown: Вы не можете пригласить этого игрока в течение [number] секунд. + island-is-full: Ваш остров полон, вы не можете больше никого пригласить. + none-invited-you: Вас никто не пригласил :c. + you-already-are-in-team: Вы уже в команде! + already-on-team: Этот игрок уже в команде! + invalid-invite: Приглашение больше не действует, извините. + you-have-already-invited: Вы уже пригласили этого игрока! parameters: <игрок> - you-can-invite: 'Вы можете пригласить еще [number] игроков.' + you-can-invite: Вы можете пригласить ещё [number] игроков. accept: description: принятие приглашения - you-joined-island: >- - Вы присоединились к острову! Используйте /[label] team чтобы - видеть других участников. - name-joined-your-island: '[name] присоединился к вашему острову!' + you-joined-island: Вы присоединились к острову! Используйте /[label] + team чтобы видеть других участников. + name-joined-your-island: [name] присоединился к вашему острову! confirmation: |- Вы уверены, что хотите принять это приглашение? Вы ПОТЕРЯЕТЕ ваш текущий остров! reject: description: отказ от приглашения - you-rejected-invite: 'Вы отклонили приглашение посетить остров.' - name-rejected-your-invite: '[name] отклонил ваш запрос на присоединение!' + you-rejected-invite: Вы отклонили приглашение посетить остров. + name-rejected-your-invite: [name] отклонил ваш запрос на присоединение! cancel: - description: отклонить ожидающие подтверждения приглашения посетить ваш остров + description: отклонить ожидающие подтверждения приглашения посетить ваш + остров leave: - cannot-leave: >- - Владелец не может покинуть остров! Сначала станьте участником, или - удалите всех участников. + cannot-leave: Владелец не может покинуть остров! Сначала станьте участником, + или удалите всех участников. description: покинуть свой остров - left-your-island: '[name] покинул ваш остров' - success: 'Вы покинули этот остров.' + left-your-island: [name] покинул ваш остров + success: Вы покинули этот остров. kick: description: удалить участника с острова parameters: <игрок> - player-kicked: '[name] был удален с вашего острова в режиме [gamemode]!' - cannot-kick: 'Вы не можете удалить самого себя!' - cannot-kick-rank: 'Ваш статус не позволяет удалить игрока [name]!' - success: '[name] был удален с вашего острова.' + player-kicked: [name] был удален с вашего острова в режиме [gamemode]! + cannot-kick: Вы не можете удалить самого себя! + cannot-kick-rank: Ваш статус не позволяет удалить игрока [name]! + success: [name] был удален с вашего острова. demote: description: понижает ранг игрока на вашем острове parameters: <игрок> errors: - cant-demote-yourself: 'Вы не можете понизить себя!' - cant-demote: 'Вы не можете понижать более высокие ранги!' - must-be-member: 'Игрок должен быть участником [prefix_an-island]!' - failure: 'Игрока нельзя опустить еще ниже!' - success: 'Игрок [name] понижен до [rank]' + cant-demote-yourself: Вы не можете понизить себя! + cant-demote: Вы не можете понижать более высокие ранги! + must-be-member: Игрок должен быть участником [prefix_an-island]! + failure: Игрока нельзя опустить ещё ниже! + success: Игрок [name] понижен до [rank] promote: description: повышает ранг игрока на вашем острове parameters: <игрок> errors: - cant-promote-yourself: 'Вы не можете повысить себя!' - cant-promote: 'Вы не можете повышать более высокие ранги!' - must-be-member: 'Игрок должен быть членом [prefix_an-island]!' - failure: 'Игрока нельзя повысить еще выше!' - success: 'Игрок [name] повышен до [rank]' + cant-promote-yourself: Вы не можете повысить себя! + cant-promote: Вы не можете повышать более высокие ранги! + must-be-member: Игрок должен быть членом [prefix_an-island]! + failure: Игрока нельзя повысить ещё выше! + success: Игрок [name] повышен до [rank] setowner: description: передать право собственности на остров участнику errors: - cant-transfer-to-yourself: >- - Вы не можете передать остров самому себе! (Хотя, по факту, вы - можете... Но мы не будем этого делать. Потому что это - бессмысленно.) - target-is-not-member: 'Этот игрок не является частью вашей команды!' - at-max: >- - Этот игрок уже имеет максимальное количество островов, которое + cant-transfer-to-yourself: Вы не можете передать остров самому себе! + (Хотя, по факту, вы можете... Но мы + не будем этого делать. Потому что это бессмысленно.) + target-is-not-member: Этот игрок не является частью вашей команды! + at-max: Этот игрок уже имеет максимальное количество островов, которое ему разрешено! - name-is-the-owner: '[name] теперь является владельцем острова!' + name-is-the-owner: [name] теперь является владельцем острова! parameters: <игрок> - you-are-the-owner: 'Вы теперь владелец острова!' + you-are-the-owner: Вы теперь владелец острова! ban: description: забанить игрока на острове parameters: <игрок> - cannot-ban-yourself: 'Вы не можете забанить самого себя!' - cannot-ban: 'Этот игрок не может быть забанен.' - cannot-ban-member: 'Сначала кикните участника, а потом баньте.' - cannot-ban-more-players: 'Вы достигли лимита банов, вы можете более банить игроков на острове.' - player-already-banned: 'Игрок уже забанен.' - player-banned: '[name]теперь забанен на вашем острове.' - owner-banned-you: '[name]забанил вас на своем острове!' - you-are-banned: 'Вы забанены на этом острове!' + cannot-ban-yourself: Вы не можете забанить самого себя! + cannot-ban: Этот игрок не может быть забанен. + cannot-ban-member: Сначала кикните участника, а потом баньте. + cannot-ban-more-players: Вы достигли лимита банов, вы можете более банить + игроков на острове. + player-already-banned: Игрок уже забанен. + player-banned: [name]теперь забанен на вашем острове. + owner-banned-you: [name]забанил вас на своем острове! + you-are-banned: Вы забанены на этом острове! unban: description: разбанить игрока на острове parameters: <игрок> - cannot-unban-yourself: 'Вы не можете разбанить самого себя!' - player-not-banned: 'Игрок не был забанен ранее.' - player-unbanned: '[name]разбанен на вашем острове.' - you-are-unbanned: '[name]разбанил вас на своем острове!' + cannot-unban-yourself: Вы не можете разбанить самого себя! + player-not-banned: Игрок не был забанен ранее. + player-unbanned: [name]разбанен на вашем острове. + you-are-unbanned: [name]разбанил вас на своем острове! banlist: description: список забаненных игроков - noone: 'Никто не забанен на этом острове.' - the-following: 'Следующие игроки забанены:' - names: '[line]' - you-can-ban: 'Вы можете забанить еще [number] игроков.' + noone: Никто не забанен на этом острове. + the-following: Следующие игроки забанены: + names: [line] + you-can-ban: Вы можете забанить ещё [number] игроков. settings: description: отображает настройки острова language: description: выбрать язык parameters: '[язык]' - not-available: 'Этот язык недоступен.' - already-selected: 'Вы уже выбрали этот язык.' + not-available: Этот язык недоступен. + already-selected: Вы уже выбрали этот язык. expel: description: выгоняет игрока с вашего острова parameters: <игрок> - cannot-expel-yourself: 'Вы не можете выгнать сами себя!' - cannot-expel: 'Этот игрок не может быть выгнан.' - cannot-expel-member: 'Вы не можете выгнать участника группы!' - not-on-island: 'Этот игрок не на вашем острове!' - player-expelled-you: '[name] выгнал вас с острова!' - success: 'Вы выгнали [name] с острова.' + cannot-expel-yourself: Вы не можете выгнать сами себя! + cannot-expel: Этот игрок не может быть выгнан. + cannot-expel-member: Вы не можете выгнать участника группы! + not-on-island: Этот игрок не на вашем острове! + player-expelled-you: [name] выгнал вас с острова! + success: Вы выгнали [name] с острова. lock: description: заблокировать или разблокировать ваш [prefix_island] - locked: 'Ваш [prefix_island] теперь заблокирован.' - unlocked: 'Ваш [prefix_island] теперь разблокирован.' - you-are-locked-out: 'Этот [prefix_island] теперь заблокирован. Вы были выгнаны.' + locked: Ваш [prefix_island] теперь заблокирован. + unlocked: Ваш [prefix_island] теперь разблокирован. + you-are-locked-out: Этот [prefix_island] теперь заблокирован. Вы были выгнаны. + ranks: owner: Владелец sub-owner: Семи-владелец @@ -1020,483 +1008,569 @@ ranks: banned: Забаненный admin: Администрация mod: Модератор + protection: command-is-banned: Команда запрещена для посетителей flags: ALLAY: - name: Взаимодействие с тихонями и медным големом - description: Позволяет забирать/давать предметы тихоне и медному голему - hint: Взаимодействие с тихонями и медным големом запрещено + name: Взаимодействие с тихоней и медным големом + description: |- + Позволяет забирать или давать предметы + тихоне или медному голему + hint: Взаимодействие с тихоней и медным големом запрещено! ANIMAL_NATURAL_SPAWN: - description: переключатель пассивного спавна животных - name: Пассивный спавн животных + name: Появление животных + description: |- + Переключает естественное + появление нейтральных животных ANIMAL_SPAWNERS_SPAWN: - description: переключатель спавна животных из спавнеров - name: Спавнеры животных + name: Рассадник животных + description: |- + Переключает появление + животных из рассадника ANVIL: - description: Переключатель возможности взаимодействовать - name: Наковальни - hint: Использование наковален запрещено + name: Наковальня + description: |- + Переключает взаимодействие + с наковальней + hint: Взаимодействие с наковальней запрещено! ARMOR_STAND: - description: Переключатель возможности взаимодействовать - name: Стойки для брони - hint: Использование стоек для брони запрещено + name: Стойка для брони + description: |- + Переключает взаимодействие + со стойкой для брони + hint: Взаимодействие со стойкой для брони запрещено! AXOLOTL_SCOOPING: name: Сбор аксолотлей - description: Позволяет собирать аксолотлей, используя ведро - hint: Сбор аксолотлей запрещен. + description: |- + Переключает возможность собирать + аксолотлей, используя ведро + hint: Возможность собирать аксолотлей в ведро запрещена! BEACON: - description: Переключатель возможности взаимодействовать - name: Маяки - hint: Использование маяков запрещено. + name: Маяк + description: |- + Переключает взаимодействие + с маяком + hint: Взаимодействие с маяком запрещено! BELL_RINGING: - description: Переключить взаимодействие - name: Разрешить звон колокола - hint: Звонок отключен + name: Колокол + description: |- + Переключает взаимодействие + с колоколом + hint: Взаимодействие с колоколом запрещено! BED: - description: Переключатель возможности взаимодействовать - name: Кровати - hint: Использование кроватей запрещено. + name: Кровать + description: |- + Переключает взаимодействие + с кроватью + hint: Взаимодействие с кроватью запрещено! BOAT: - name: Лодки + name: Лодка description: |- - Переключатель размещения, ломания и - входа в лодку. - hint: Взаимодействие с лодками запрещено. + Переключает размещения, ломания + и посадку в лодку + hint: Взаимодействие с лодкой запрещено! BOOKSHELF: - name: Книжные полки + name: Резная книжная полка description: |- - Позволяет класть или - вытаскивать книги. - hint: Взаимодействие с книжными полками запрещено. + Переключает взаимодействие + с резными книжными полками + hint: Взаимодействие с книжными полками запрещено! BREAK_BLOCKS: - description: переключатель разрушения name: Разрушение блоков - hint: Разрушение блоков запрещено + description: Переключает разрушение блоков + hint: Разрушение блоков запрещено! BREAK_SPAWNERS: - description: |- - Переключатель разрушения спавнеров. - Перезаписывает значение флага "разрушение блоков". - name: Разрушение спавнеров - hint: Разрушение спавнеров запрещено + name: Разрушение рассадников + description: Переключает разрушение рассадников + hint: Разрушение рассадников запрещено! BREAK_HOPPERS: - description: |- - Переключатель разрушения воронок. - Перезаписывает значения флага "разрушение блоков". name: Разрушение воронок - hint: Разрушение воронок запрещено + description: Переключает разрушение воронок + hint: Разрушение воронок запрещено! BREEDING: - description: переключатель размножения - name: Размножение животных - hint: Животных нельзя разводить + name: Разведение животных + description: Переключает разведение животных + hint: Разведение животных запрещено! BREWING: - description: Переключатель возможности взаимодействовать name: Зельеварка - hint: Зельеваркой пользоваться нельзя + description: |- + Переключает взаимодействие + с зельеваркой + hint: Взаимодействие с зельеваркой запрещено! BUCKET: - description: Переключатель возможности взаимодействовать name: Ведро - hint: Использование вёдер запрещено + description: |- + Переключает взаимодействие + с ведром + hint: Взаимодействие с ведром запрещено! BUTTON: - description: переключатель нажатия - name: Кнопки - hint: Использование кнопок запрещено + name: Кнопка + description: |- + Переключает взаимодействие + с кнопкой + hint: Взаимодействие с кнопкой запрещено! CANDLES: - description: Переключить взаимодействие с [candle] - name: Свечи - hint: 'Взаимодействие с [свечами] отключено' + name: Свеча + description: |- + Переключает взаимодействие + со свечой + hint: Взаимодействие со свечой запрещено! CAKE: - description: Переключатель возможности взаимодействовать с тортами - name: Торты - hint: Поедание тортов запрещено + name: Торт + description: |- + Переключает взаимодействие + с тортом + hint: Взаимодействие с тортом запрещено! CARTOGRAPHY: - name: Картографические столы - description: Переключить использование - hint: Доступ к столу картографии отключен + name: Стол картографа + description: |- + Переключает взаимодействие + со столом картографа + hint: Взаимодействие со столом картографа запрещено! CONTAINER: - name: ВСЕ контейнеры - description: |- - Переключатель возможности взаимодействовать со всеми контейнерами. - Включает: бочка, улей, зельеварка, - сундук, компостница, раздатчик, выбрасыватель, - цветочный горшок, печка, воронка, рамка, - музыкальный блок, грузовая вагонетка, шалкеровый ящик, - сундук-ловушка. + name: Все контейнеры + description: |- + Переключает взаимодействие + со всеми контейнерами. + + Включает в себя: бочка, улей, зельеварка, сундук, + компостница, печка, выбрасыватель, проигрыватель, + цветочный горшок, раздатчик, рамка, сундук-ловушка, + воронка, грузовая вагонетка, шалкеровый ящик. - Изменение индивидуальных настроек перезаписывает - данный флаг. - hint: Доступ к контейнерам запрещен + Изменение отдельных настроек + перезаписывает данный флаг + hint: Взаимодействие с контейнером запрещено! CHEST: - name: Сундуки и грузовые вагонетки + name: Сундук и грузовая вагонетка description: |- - Переключатель возможности взаимодействовать с сундуками - и грузовыми вагонетками. - (не включает сундук-ловушку) - hint: Доступ к сундукам запрещен + Переключает взаимодействие с сундуками + и грузовыми вагонетками + hint: Взаимодействие с сундуком или грузовой вагонеткой запрещено! BARREL: name: Бочка - description: Переключатель возможности взаимодействовать с бочками - hint: Доступ к бочкам запрещен + description: |- + Переключает взаимодействие + с бочкой + hint: Взаимодействие с бочкой запрещено! CRAFTER: - name: Крафт - description: Использование переключения - hint: Крафт отключен + name: Сборщик + description: |- + Переключает взаимодействие + со сборщиком + hint: Взаимодействие со сборщиком запрещено! BLOCK_EXPLODE_DAMAGE: + name: Урон от взрыва description: |- Позволяет кроватям и якорям возрождения разрушать блоки и наносить урон сущностям - name: Урон от взрыва COMPOSTER: name: Компостница - description: Переключатель возможности взаимодействовать с компостницей - hint: Взаимодействие с компостницей запрещено + description: |- + Переключает взаимодействие + с компостницей + hint: Взаимодействие с компостницей запрещено! LOOM: name: Ткацкий станок - description: Переключить использование - hint: Доступ к ткацкому станку отключен + description: |- + Переключает взаимодействие + с ткацким станком + hint: Взаимодействие с ткацким станком запрещено! FLOWER_POT: name: Цветочный горшок - description: Переключатель возможности взаимодействовать с цветочными горшками - hint: Взаимодействие с цветочными горшками запрещено + description: |- + Переключает взаимодействие + с цветочным горшком + hint: Взаимодействие с цветочным горшком запрещено! GRINDSTONE: - name: Заточная станция - description: Переключить использование - hint: Доступ к Заточная станция отключен + name: Точило + description: |- + Переключает взаимодействие + с точилом + hint: Взаимодействие с точилом запрещено! SHULKER_BOX: name: Шалкеровые ящики - description: Переключатель возможности взаимодействовать с шалкеровыми ящиками - hint: Доступ к шалкеровым ящикам запрещен - SHULKER_TELEPORT: description: |- - Шалкеры могут телепортироваться - если активно. + Переключает взаимодействие + с шалкеровым ящиком + hint: Взаимодействие с шалкеровым ящиком запрещено! + SHULKER_TELEPORT: name: Телепортация шалкеров + description: Переключает телепортацию шалкеров SMITHING: - name: Кузнечное дело - description: Переключить использование - hint: Доступ к кузнице отключен + name: Стол кузнеца + description: |- + Переключает взаимодействие + со столом кузнеца + hint: Взаимодействие со столом кузнеца запрещено! STONECUTTING: - name: Резка камня - description: Переключить использование - hint: Доступ к резке камня отключен + name: Камнерез + description: |- + Переключает взаимодействие + с камнерезом + hint: Взаимодействие с камнерезом запрещено! TRAPPED_CHEST: name: Сундук-ловушка - description: Переключатель возможности взаимодействовать с сундуком-ловушкой - hint: Взаимодействие с сундуком-ловушкой запрещено + description: |- + Переключает взаимодействие + с сундуком-ловушкой + hint: Взаимодействие с сундуком-ловушкой запрещено! DISPENSER: name: Раздатчик - description: Переключатель возможности взаимодействовать с раздатчиком - hint: Взаимодействие с раздатчиком запрещено + description: |- + Переключает взаимодействие + с раздатчиком + hint: Взаимодействие с раздатчиком запрещено! DROPPER: name: Выбрасыватель - description: Переключатель возможности взаимодействовать с выбрасывателем - hint: Взаимодействие с выбрасывателем запрещено + description: |- + Переключает взаимодействие + с выбрасывателем + hint: Взаимодействие с выбрасывателем запрещено! ELYTRA: name: Элитры - description: Переключатель возможности использовать элитр - hint: 'Элитры не могут быть использованы здесь!' + description: Переключает использование элитр + hint: Использование элитр запрещено! HOPPER: - name: Воронки - description: Переключатель возможности взаимодействовать с воронкой - hint: Взаимодействие с воронкой запрещено + name: Воронка + description: |- + Переключает взаимодействие + с воронкой + hint: Взаимодействие с воронкой запрещено! CHEST_DAMAGE: - description: переключатель получения сундуками урона от взрыва - name: Урон сундукам + name: Урон по сундукам + description: Переключает получение урона от взрыва по сундукам CHORUS_FRUIT: - description: переключатель телепортации - name: Плоды хоруса - hint: Телепортация с использованием плодов хоруса запрещена + name: Плод хоруса + description: |- + Переключает телепортацию после + съедания плода хоруса + hint: Телепортация после съедания плода хоруса запрещена! CLEAN_SUPER_FLAT: + name: Очищать супер плоские чанки description: |- Позволяет очистить любые - супер плоские чанки в - мире - name: Очистить супер плоские чанки + супер плоские чанки в мирах COARSE_DIRT_TILLING: + name: Обработка каменистой земли description: |- - Переключатель очистки каменистой - земли и разрушения подзола - для получения земли - name: Очищение каменистой земли - hint: Запрещено очищать землю + Переключает обработку каменистой земли + и разрушения подзола ля получения земли + hint: Обработка каменистой земли запрещена! COLLECT_LAVA: + name: Сбор лавы description: |- - Переключатель сбора лавы + Переключает сбор лавы (перезаписывает флаг "Ведро") - name: Сбор лавы - hint: Нельзя собирать лаву + hint: Сбор лавы запрещён! COLLECT_WATER: + name: Сбор воды description: |- - Переключатель сбора воды + Переключает сбор воды (перезаписывает флаг "Ведро") - name: Сбор воды - hint: Сбор воды запрещен + hint: Сбор воды запрещён! COLLECT_POWDERED_SNOW: + name: Сбор рыхлого снега description: |- - Переключатель сбора рыхлого снега + Переключает сбор рыхлого снега (перезаписывает флаг "Ведро") - name: Сбор рыхлого снега - hint: Сбор рыхлого снега запрещен + hint: Сбор рыхлого снега запрещён! COMMAND_RANKS: - name: 'Командный ранг' - description: 'Управление командным рангом' + name: Командный ранг + description: Управление командами CRAFTING: - description: Переключатель возможности использовать name: Верстак - hint: Доступ к верстаку запрещен + description: |- + Переключает взаимодействие + с верстаком + hint: Взаимодействие с верстаком запрещено! CREEPER_DAMAGE: - description: | - Переключатель урон от крипера - name: Защита от урона крипера + name: Защита от взрыва крипера + description: Переключает взрыв от крипера CREEPER_GRIEFING: - description: | - Переключатель возможности - посетителю поджечь крипера - name: Защита от грифа крипером - hint: Поджигание крипера запрещено + name: Защита от поджога крипера + description: Переключает поджог крипера + hint: Поджигание крипера запрещено! CROP_PLANTING: - description: 'Установите, кто может сажать саженцы.' name: Посадка саженцев - hint: Посадка саженцев запрещена + description: Переключает посадку саженцев + hint: Посадка саженцев запрещена! CROP_TRAMPLE: - description: переключатель возможности топтать саженцы - name: Топтание саженцев - hint: Топтание саженцев невозможно + name: Топтание посевов + description: Переключает топтание посевов + hint: Топтание посевов запрещено! DOOR: - description: Переключатель возможности использовать дверей - name: Использование дверей - hint: Использование дверей запрещено + name: Дверь + description: |- + Переключает взаимодействие + с дверью + hint: Взаимодействие с дверью запрещено! DRAGON_EGG: - name: Яйцо Дракона + name: Яйцо дракона description: |- - Предотвращает взаимодействие с Яйцом Дракона. - - Это не защищает его от установки или разрушения - hint: Взаимодействие с Яйцом Дракона запрещено + Переключает взаимодействие + с яйцом дракона + hint: Взаимодействие с яйцом дракона запрещено! DYE: - description: предотвращает использование красителей - name: Использование красителей - hint: Использование красителей запрещено + name: Краситель + description: |- + Переключает использование + красителей + hint: Использование красителей запрещено! EGGS: - description: переключатель возможности бросания яиц name: Бросание яиц - hint: Бросание яиц запрещено + description: Переключает бросание яиц + hint: Бросание яиц запрещено! ENCHANTING: - description: Переключатель возможности использовать - name: Стол зачарования - hint: Стол зачарования недоступен + name: Чародейский стол + description: |- + Переключает взаимодействие + с чародейским столом + hint: Взаимодействие с чародейским столом запрещено! ENDER_CHEST: - description: Переключатель возможности использовать/крафта - name: Эндер сундук - hint: Эндер сундук отключен в этом мире + name: Эндер-сундук + description: |- + Переключает взаимодействие + с эндер-сундуком + hint: Взаимодействие с эндер-сундуком запрещено! ENDERMAN_DEATH_DROP: + name: Дроп эндермена при смерти description: |- Эндермен будет бросать любой блок, что он держит когда будет убит. - name: Дроп эндермена при смерти ENDERMAN_GRIEFING: + name: Гриф от эндермена description: |- - Эндермены могут собирать блоки - на острове - name: Гриф эндерменом + Эндермены могут собирать + блоки на острове ENDERMAN_TELEPORT: - description: 'Эндермены могут телепортироваться, если активно' - name: Телепорт эндермена + name: Телепортация эндерменов + description: Переключает телепортацию эндерменов ENDER_PEARL: - description: Переключатель возможности использовать - name: Эндерперл - hint: Использование эндерперла запрещено + name: Эндер-жемчуг + description: |- + Переключает использование + эндер-жемчуга + hint: Использование эндер-жемчуга запрещено! ENTER_EXIT_MESSAGES: + name: Сообщения входа/выхода description: Отображает сообщение о входе/выходе с острова island: Остров - name: Сообщения входа/выхода - now-entering: 'Вы вошли на [name].' - now-entering-your-island: 'Вы вошли на свой остров.' - now-leaving: 'Вы вышли с [name].' - now-leaving-your-island: 'Вы покинули свой остров.' + now-entering: Вы вошли на [name]. + now-entering-your-island: Вы вошли на свой остров. + now-leaving: Вы вышли с [name]. + now-leaving-your-island: Вы покинули свой остров. EXPERIENCE_BOTTLE_THROWING: - name: Бросание бутыльков опыта - description: переключатель бросания бутыльков опыта - hint: Бросание бутыльков опыта запрещено + name: Пузырёк опыта + description: |- + Переключает бросание + пузырька опыта + hint: Бросание пузырька опыта запрещено! FIRE_BURNING: name: Горение - description: 'Переключение возможности огня...гореть' + description: Переключает огню гореть FIRE_EXTINGUISH: - description: переключатель тушения огня name: Тушение огня - hint: Тушение огня запрещено + description: Переключает тушение огня + hint: Тушение огня запрещено! FIRE_IGNITE: name: Поджог - description: 'Переключатель возможности огню загореться не от игрока' + description: Переключает случайный поджог FIRE_SPREAD: name: Распространение огня description: |- - Переключатель возможности огню распространяться - на близлежащие блоки. + Переключает огню распространяться + на близлежащие блоки FISH_SCOOPING: name: Сбор рыбы - description: переключатель возможности собирать рыбу ведром - hint: Нельзя собирать рыбу ведром + description: Переключает сбор рыбы ведром + hint: Сбор рыбы ведром запрещён! FLINT_AND_STEEL: name: Огниво description: |- - Переключатель возможности игрокам - поджигать блоки или костры, используя - огниво или огненный заряд. - hint: Запрещено использовать огниво и/или огненный заряд + Переключает игрокам поджигать блоки + или костры, используя огниво или + огненный заряд + hint: Использование огнива запрещено! FURNACE: - description: Переключатель возможности использовать name: Печь - hint: Использование печи запрещено + description: |- + Переключает взаимодействие + с печкой + hint: Взаимодействие с печкой запрещено! GATE: - description: Переключатель возможности использовать - name: Ворота - hint: Использование ворот запрещено + name: Калитка + description: |- + Переключает взаимодействие + с калиткой + hint: Взаимодействие с калиткой запрещено! GEO_LIMIT_MOBS: + name: Лимит мобов на острове description: |- Удалять мобов, которые вышли за пределы острова - name: 'Лимит мобов на острове' HARVEST: - description: |- - Установите, кто может собирать урожай. - Не забудьте активировать подбор предметов! name: Сбор урожая - hint: Сбор урожая запрещен + description: Переключает сбор урожая + hint: Сбор урожая запрещён! HIVE: - description: переключатель сбора урожая с ульев name: Сбор урожая с ульев - hint: Сбор урожая с ульев запрещен + description: Переключает сбор урожая с ульев + hint: Сбор урожая с ульев запрещён! HURT_TAMED_ANIMALS: - description: >- - Переключить вред. Включено означает, что прирученные животные могут - получать урон. Выключено означает, что они неуязвимы. - name: Наносит урон прирученным животным - hint: Прирученное животное нанесение урона отключено + name: Урон по прирученным животным + description: |- + Переключает нанесение урона + по прирученным животным + hint: Урон по прирученным животным запрещён! HURT_ANIMALS: - description: переключатель урона name: Урон по животным - hint: Урон по животным нанести нельзя + description: |- + Переключает нанесение + урона по животным + hint: Урон по животным запрещён! HURT_MONSTERS: - description: переключатель урона name: Урон по монстрам - hint: Урон по монстрам нанести нельзя + description: |- + Переключает нанесение + урона по монстрам + hint: Урон по монстрам запрещён! HURT_VILLAGERS: - description: переключатель урона name: Урон по крестьянинам - hint: Урон по крестьянинам нанести нельзя + description: |- + Переключает нанесение + урона по крестьянинам + hint: Урон по крестьянинам запрещён! ITEM_FRAME: name: Рамка description: |- - Переключатель возможности взаимодействовать. - Перезаписывает флаг ломания или установки блоков - hint: Использование рамок запрещено + Переключает взаимодействие + с рамкой + hint: Взаимодействие с рамкой запрещено! ITEM_FRAME_DAMAGE: - description: 'Мобы могут ломать рамки' name: Урон по рамкам + description: |- + Переключает урон + по рамкам от мобов INVINCIBLE_VISITORS: - description: 'Конфигурация неуязвимости посетителей' - name: 'Неуязвимые посетители' - hint: 'Посетители защищены' + name: Неуязвимые посетители + description: |- + Конфигурация неуязвимости + посетителей + hint: Посетитель защищён! ISLAND_RESPAWN: - description: 'Игроки респавнятся на острове' name: Респавн на острове + description: Игроки респавнятся на острове ITEM_DROP: - description: переключатель выбрасывания name: Выбрасывание предметов - hint: Выбрасывание предметов запрещено + description: Переключает выбрасывание предметов + hint: Выбрасывание предметов запрещено! ITEM_PICKUP: - description: переключатель подбирания name: Подбирание предметов - hint: Подбирание предметов запрещено + description: Переключает подбирание предметов + hint: Подбирание предметов запрещено! JUKEBOX: - description: Переключатель возможности использовать - name: Использование проигрывателя - hint: Использование проигрывателя запрещено + name: Проигрыватель + description: |- + Переключает взаимодействие + с проигрывателем + hint: Взаимодействие с проигрывателем запрещено! LEAF_DECAY: name: Гниение листьев - description: Позволяет листьям естественным образом гнить + description: |- + Переключает листьям гнить + естественным образом LEASH: - description: Переключатель возможности использовать - name: Использование поводка - hint: Использование поводка отключено + name: Поводок + description: |- + Переключает взаимодействие + с поводком + hint: Взаимодействие с поводком запрещено! LECTERN: - name: Кафедры + name: Кафедра description: |- - Позволяет положить/извлечь книгу из кафедры - - Не предотвращает возможность прочесть книгу - hint: Невозможно положить/извлечь книгу из кафедры + Переключает взаимодействие + с кафедрой + hint: Взаимодействие с кафедрой запрещено! LEVER: - description: Переключатель возможности использовать - name: Использование рычага - hint: Использование рычага запрещено + name: Рычаг + description: |- + Переключает взаимодействие + с рычагом + hint: Взаимодействие с рычагом запрещено! LIMIT_MOBS: + name: Лимит на количество мобов description: |- - Ограничение на количество - мобов, спавящихся в этом игровом режиме - name: 'Лимит на количество мобов' - can: 'Могут спавниться' - cannot: 'Не могут спавниться' + Ограничение на количество мобов, + спавящихся в этом игровом режиме + can: Могут спавниться + cannot: Не могут спавниться LIQUIDS_FLOWING_OUT: name: Жидкости вытекают за край острова description: |- - Переключатель возможности жидкостям + Переключает возможность жидкостям вытекать за пределы острова. + Отключение этого позволяет избежать - создание булыжника между двумя островами + создание булыжника между двумя островами. - Учтите, что жидкости все еще будут течь вертикально. + Учтите, что жидкости всё ещё будут течь вертикально. Они также не будут распространяться горизонтально если расположены за границей острова. LOCK: - description: переключатель блокировки - name: Блокировка острова + name: Блокировка + description: Переключает блокировку острова CHANGE_SETTINGS: name: Изменение настроек description: |- - Позволяет переключаться между - участниками или ролями, кто может менять настройки. + Переключает изменение + настроек участникам MILKING: - description: Переключатель дойки name: Дойка - hint: Дойка коров запрещена + description: Переключает доение + hint: Доение запрещено! MINECART: - name: Вагонетки + name: Вагонетка description: |- - Переключатель установки, ломания - и входа в вагонетку. - hint: Взаимодействие с вагонетками запрещено + Переключает установку, ломание + и посадку в вагонетку + hint: Взаимодействие с вагонетками запрещено! MONSTER_NATURAL_SPAWN: - description: переключатель пассивного спавна монстров - name: Пассивный спавн монстров + name: Появление монстров + description: |- + Переключает естественное + появление монстров MONSTER_SPAWNERS_SPAWN: - description: переключатель спавна монстров через спавнера - name: Спавнера монстров + name: Рассадник монстров + description: |- + Переключает появление + монстров из рассадника MOUNT_INVENTORY: + name: Инвентарь верхового животного description: |- - Переключатель доступа - к инвентарю животного - name: Инвентарь животного - hint: Инвентарь животного недоступен + Переключает доступ к инвентарю + верхового животного + hint: Инвентарь верхового животного недоступен! NAME_TAG: name: Бирка - description: Переключатель возможности использовать - hint: Использование бирки запрещено + description: Переключает использование бирки + hint: Использование бирки запрещено! NATURAL_SPAWNING_OUTSIDE_RANGE: name: Пассивный спавн за пределами острова description: |- - Переключатель возможности сущностям - (монстры и мобы) пассивно спавниться - за пределами острова. + Переключает возможность сущностям + пассивно появляться за пределами острова. Учтите, что это не влияет на спавн через - спавнера или яйца призыва. + рассадник или яйца призыва NOTE_BLOCK: - description: Переключатель возможности использовать name: Нотный блок - hint: Взаимодействие с нотным блоком запрещено + description: |- + Переключает взаимодействие + с нотным блоком + hint: Взаимодействие с нотным блоком запрещено! OBSIDIAN_SCOOPING: name: Сбор обсидиана description: |- @@ -1505,210 +1579,221 @@ protection: Учтите: обсидиан нельзя собрать если рядом находится другой обсидиан - в радиусе 2 блоков. - scooping: 'Обсидиан превращен в лаву. Будьте осторожны в следующий раз!' - cooldown: 'Вы должны подождать, прежде чем зачерпнуть ещё один блок обсидиана.' - obsidian-nearby: >- - В радиусе 2 блоков есть еще обсидиан, вы не можете собрать этот блок - в лаву ([radius]) + в радиусе 2 блоков + scooping: Обсидиан был превращён в лаву. + cooldown: Подождите несколько секунд, чтобы зачерпнуть снова. + obsidian-nearby: В радиусе [radius] блоков есть ещё обсидиан. OFFLINE_GROWTH: + name: Оффлайн рост description: |- Когда отключено, растения не будут пассивно расти когда все участники не в сети. Может снизить лаги. - name: Оффлайн рост OFFLINE_REDSTONE: + name: Оффлайн редстоун description: |- Когда отключено, редстоун механизмы не будут работать когда все участники не в сети. Может снизить лаги. - Не влияет на остров спавна. - name: Оффлайн редстоун PETS_STAY_AT_HOME: + name: Питомцы остаются дома description: |- Когда активно, прирученные питомцы могут перемещаться только по вашему острову и не могут его покинуть. - name: Питомцы остаются дома PISTON_PUSH: + name: Защита от толкания поршнями description: |- Включите это для предотвращения толкания блоков за пределы острова. - name: Защита от толкания поршнями PLACE_BLOCKS: - description: Переключатель возможности взаимодействовать name: Установка блоков - hint: Установка блоков запрещена + description: Переключает установку блоков + hint: Установка блоков запрещена! PODZOL: - name: Производство древесного подзола + name: Производство подзола description: |- - Если отключено, предотвратит - производство древесного подзола - при росте больших деревьев + Если отключено, предотвратит производство + подзола при росте больших деревьев POTION_THROWING: name: Бросание зелий - description: |- - Переключатель бросания зелий. - Включает взрывные и туманные зелья. - hint: Бросание зелий запрещено + description: Переключает бросание зелий + hint: Бросание зелий запрещено! NETHER_PORTAL: - description: Переключатель возможности использовать name: Портал в Незер - hint: Использование портала запрещено + description: Переключает телепортацию в Незер + hint: Телепортация в Незер запрещена! END_PORTAL: - description: Переключатель возможности использовать - name: Портал в Край - hint: Использование портала в Край запрещено + name: Портал в Энд + description: Переключает телепортацию в Энд + hint: Телепортация в Энд запрещена! PAUSE_MOB_GROWTH: name: Приостановка роста мобов description: |- - Переключение использования золотого + Переключает использование золотого одуванчика для приостановки или возобновления роста детёнышей мобов - hint: Приостановка роста мобов отключена + hint: Приостановка роста мобов запрещена! PRESSURE_PLATE: - description: Переключатель возможности использовать - name: Нажимные плиты - hint: Взаимодействие с нажимными плитами запрещено + name: Нажимная плита + description: |- + Переключает взаимодействие + с нажимной плитой + hint: Взаимодействие с нажимными плитами запрещено! PVP_END: + name: Урон по игрокам в Энде description: |- - Вкл/Выкл PVP - в Краю. - name: PVP в Краю - hint: PVP в Краю отключено - enabled: 'PVP в Краю было активировано.' - disabled: 'PVP в Краю было отключено.' + Переключает урон по + игрокам в Энде + hint: Урон по игрокам в Энде отключен! + enabled: Урон по игрокам в Энде был активирован. + disabled: Урон по игрокам в Энде был деактивирован. PVP_NETHER: + name: Урон по игрокам в Незере description: |- - Вкл/Выкл PVP - в Незере. - name: Незер PVP - hint: PVP отключено в Незере - enabled: 'PVP в Незере было активировано.' - disabled: 'PVP в Незере было отключено.' + Переключает урон по + игрокам в Незере + hint: Урон по игрокам в Незере отключен! + enabled: Урон по игрокам в Незере был активирован. + disabled: Урон по игрокам в Незере был деактивирован. PVP_OVERWORLD: + name: Урон по игрокам в Верхнем мире description: |- - Вкл/Выкл PVP - на острове. - name: PVP в верхнем мире - hint: 'PVP отключено в верхнем мире' - enabled: 'PVP в верхнем мире было активировано.' - disabled: 'PVP в верхнем мире было отключено.' + Переключает урон по + игрокам в Верхнем мире + hint: Урон по игрокам в Верхнем мире отключен! + enabled: Урон по игрокам в Верхнем мире был активирован. + disabled: Урон по игрокам в Верхнем мире был деактивирован. REDSTONE: - description: Переключатель возможности использовать - name: Редстоун механизмы - hint: Взаимодействие с редстоун механизмами запрещено + name: Редстоуновые механизмы + description: |- + Переключает взаимодействие + с редстоуновыми механизмами + hint: Взаимодействие с редстоуновыми механизмами запрещено! REMOVE_END_EXIT_ISLAND: + name: Удалить выходной остров в Энде description: |- Предотвращает генерацию - выходного [prefix_island] в Энде - на координатах 0,0 - name: Удалить выходной остров в Энде + выходного острова в Энде REMOVE_MOBS: + name: Удаление монстров description: |- Удаляет монстров, когда вы телепортируетесь на остров - name: Удаление монстров RIDING: - description: переключатель езды name: Езда на животных - hint: Езда на животных запрещена + description: Переключает езду на животных + hint: Езда на животных запрещена! SHEARING: - description: переключатель стрижки name: Стрижка - hint: Стрижка запрещена + description: Переключает стрижку + hint: Стрижка запрещена! SPAWN_EGGS: - description: Переключатель возможности использовать name: Яйца призыва - hint: Использование яиц призыва запрещено + description: |- + Переключает использование + яиц призыва + hint: Использование яиц призыва запрещено! SPAWNER_SPAWN_EGGS: + name: Яйца призыва в рассаднике description: |- - Позволяет изменять тип сущности в спавнере, - используя яйцо призыва. - name: Яйца призыва в спавнере - hint: Изменение сущности в спавнере недоступно + Позволяет изменять тип сущности в рассаднике, + используя яйцо призыва + hint: Изменение сущности в рассаднике запрещено! SCULK_SENSOR: + name: Скалк-сенсор description: |- - Переключатель активации - сенсора. - name: Скалк сенсор - hint: Активация скалк сенсора запрещена + Переключает активацию + скалк-сенсора + hint: Активация скалк-сенсора запрещена! SCULK_SHRIEKER: - description: 'Переключатель активации скалк-крикуна' - name: Скалк-крикун - hint: Активация скалк-крикуна запрещена + name: Скалковый крикун + description: |- + Переключает активацию + скалкового крикуна + hint: Активация скалкового крикуна запрещена! SIGN_EDITING: - description: 'Позволяет редактировать текст на табличках' name: Редактирование табличек - hint: Редактирование табличек запрещено + description: |- + Переключает редактирование + текста на табличках + hint: Редактирование табличек запрещено! TNT_DAMAGE: + name: Урон от динамита description: |- - Позволяет TNT и вагонеткам с динамитом - взрывать блоки и наносить урон - сущностям. - name: TNT урон + Позволяет динамиту и вагонеткам с динамитом + взрывать блоки и наносить урон сущностям TNT_PRIMING: - description: |- - Предотвращает поджог TNT. - Это не перезаписывает - защиту от поджога. - name: TNT поджог - hint: TNT поджог запрещен + name: Поджог динамита + description: Предотвращает поджог динамита + hint: Поджог динамита запрещён! TRADING: - description: переключатель торговли - name: Торговля с жителями - hint: Торговля с жителями запрещена + name: Торговля с крестьянинами + description: |- + Переключает торговлю + с крестьянинами + hint: Торговля с крестьянинами запрещена! TRAPDOOR: - description: переключатель доступа - name: Люки - hint: Использование люков запрещено + name: Люк + description: |- + Переключает взаимодействие + с люком + hint: Взаимодействие с люком запрещено! TREES_GROWING_OUTSIDE_RANGE: name: Рост деревьев за пределы острова description: |- - Переключатель возможности деревьям + Переключает возможность деревьям расти за пределы острова. + Активация позволит спавниться за островам листьям и древесине, а отключение также предотвратит посадку саженцев, но деревья будут выглядеть обрезанными TURTLE_EGGS: - description: переключатель разрушения - name: Черепашьи яйца - hint: Разрушение черепашьих яиц запрещено + name: Черепашье яйцо + description: |- + Переключает разрушение + черепашьих яиц + hint: Разрушение черепашьих яиц запрещено! FROST_WALKER: - description: переключатель зачарования Ледоход name: Ледоход - hint: Ледоход не будет работать здесь + description: |- + Переключает использование + зачарования ледоход + hint: Использование зачарования ледоход здесь запрещено! EXPERIENCE_PICKUP: name: Подбор опыта - description: переключатель возможности подбирать опыт - hint: Подбор опыта запрещен + description: |- + Переключает возможность + подбирать опыт + hint: Подбор опыта запрещён! PREVENT_TELEPORT_WHEN_FALLING: name: Предотвращать телепортацию во время падения description: |- Предотвращает использование команды телепортации назад на остров во время падения - hint: 'Вы не можете использовать это во время падения.' + hint: Вы не можете использовать это во время падения! VISITOR_KEEP_INVENTORY: name: Посетители сохраняют инвентарь после смерти description: |- Предотвращает потерю посетителями инвентаря - и опыта, если они умрут на чужом острове - - Участники острова все еще будут терять вещи, - если будут умирать на своем острове! + и опыта, если они умрут на чужом острове. + + Участники острова всё ещё будут терять вещи, + если будут умирать на своём острове SPAWN_PROTECTION: - name: Защита от пустоты на острове спавна + name: Защита от пустоты description: |- - Если включено, игроки, упавшие - в пустоту на острове спавна, - будут телепортированы обратно на - точку спавна вместо смерти. + Если включено, игроки, упавшие в пустоту, + будут телепортированы обратно на точку + спавна вместо смерти. RAID_TRIGGER: - name: Запуск рейда - description: Устанавливает минимальный ранг острова для запуска рейда - hint: Запуск рейда не разрешён + name: Рейд + description: |- + Устанавливает минимальный + ранг для запуска рейда + hint: Запуск рейда запрещён! ENTITY_PORTAL_TELEPORT: name: Использование портала сущностями description: |- @@ -1717,71 +1802,70 @@ protection: WIND_CHARGE: name: Заряд ветра description: |- - Переключает использование зарядов ветра. - Если отключено, посетители не могут - использовать заряды ветра на этом острове. - hint: Использование зарядов ветра отключено + Переключает использование + зарядов ветра + hint: Использование зарядов ветра запрещено! WITHER_DAMAGE: name: Урон от Визера description: |- - Активация позволит Визеру - разрушать блоки и наносить урон сущностям + Активация позволит Визеру разрушать + блоки и наносить урон сущностям WORLD_BLOCK_EXPLODE_DAMAGE: + name: Разрушение блоков взрывом кровати description: |- Позволяет кроватям и якорю возрождения разрушать блоки и наносить урон сущностям - за пределами острова. - name: Разрушение блоков взрывом кровати + за пределами острова WORLD_TNT_DAMAGE: + name: Разрушение блоков через динамит description: |- - Позволяет TNT и вагонетке с динамитом + Позволяет динамиту и вагонетке с динамитом разрушать блоки и наносить урон сущностям - за пределами острова. - name: Разрушение блоков через TNT - locked: 'Этот остров заблокирован!' - locked-island-bypass: 'Этот [prefix_island] заблокирован, но у вас есть разрешение на вход.' - protected: 'Остров защищен: [description].' - world-protected: 'Мир защищен: [description].' - spawn-protected: 'Спавн защищен: [description].' + за пределами острова + locked: Этот остров заблокирован! + locked-island-bypass: Этот [prefix_island] заблокирован, но у вас есть разрешение на вход. + protected: 'Остров защищён: [description].' + world-protected: 'Мир защищён: [description].' + spawn-protected: 'Спавн защищён: [description].' + panel: - next: 'Следующая страница' - previous: 'Предыдущая страница' + next: Следующая страница + previous: Предыдущая страница mode: advanced: - name: 'Расширенные настройки' - description: 'Отображает больше настроек.' + name: Расширенные настройки + description: Отображает больше настроек. basic: - name: 'Базовые настройки' - description: 'Показывает самые нужные настройки.' + name: Базовые настройки + description: Показывает самые нужные настройки. expert: - name: 'Экспертные настройки' - description: 'Показывает все доступные настройки.' - click-to-switch: 'Нажмите, для переключения [next].' + name: Экспертные настройки + description: Показывает все доступные настройки. + click-to-switch: Нажмите, для переключения [next]. reset-to-default: - name: 'Сбросить значение' - description: | - Сбрасывает ВСЕ настройки к их + name: Сбросить значение + description: |- + Сбрасывает ВСЕ настройки к их значениям по умолчанию. confirm: подтвердить - instructions: 'Вы уверены? Введите "подтвердить" , чтобы сбросить все.' + instructions: Введите "подтвердить", чтобы сбросить все. PROTECTION: - title: 'Настройки защиты' - description: 'Настройки защиты для этого острова' + title: Основные настройки + description: Настройки защиты для этого острова. SETTING: - title: 'Настройки' - description: |- - Основные настройки - для этого острова + title: Дополнительные настройки + description: Настройки защиты для этого острова. WORLD_SETTING: - title: '[world_name] настройки' - description: 'Настройки для этого игрового мира' + title: [world_name] настройки + description: Настройки для этого игрового мира. WORLD_DEFAULTS: - title: '[world_name] защита мира' + title: [world_name] защита мира description: | Настройки защиты для случаев, когда игроки вне их острова flag-item: - name-layout: '[name]' + name-layout: [name] + # Добавляйте команды в этот список по мере необходимости. command-instructions: setname: |- Выберите ранг, который может @@ -1834,68 +1918,68 @@ protection: border: |- Выберите ранг, который может использовать команду границы - description-layout: | - [description] + description-layout: |- + [description]. - Левый клик для движения вниз. - Правый клик для движения вверх. + ЛКМ для движения вниз. + ЛКМ для движения вверх. Разрешено для: - allowed-rank: '- [rank]' - blocked-rank: '- [rank]' - minimal-rank: '- [rank]' - menu-layout: | - [description] + allowed-rank: - [rank] + blocked-rank: - [rank] + minimal-rank: - [rank] + menu-layout: |- + [description]. Нажмите для открытия. - setting-cooldown: 'Настройка на перезарядке' - setting-layout: | - [description] + setting-cooldown: Настройка на перезарядке + setting-layout: |- + [description]. Нажмите для переключения. Текущая настройка: [setting] - setting-active: 'Активно' - setting-disabled: 'Отключено' + setting-active: Активно + setting-disabled: Отключено + management: panel: title: Управление BentoBox views: gamemodes: - name: 'Игровые режимы' - description: 'Нажмите для отображения загруженных игровых режимов' + name: Игровые режимы + description: Нажмите для отображения загруженных игровых режимов blueprints: - name: 'Чертежи' - description: 'Открывает админское меню управления чертежами.' + name: Чертежи + description: Открывает админское меню управления чертежами. gamemode: - name: '[name]' - description: | - Острова: [islands] + name: [name] + description: 'Острова: [islands]' addons: - name: 'Дополнения' - description: 'Нажмите для отображения загруженных дополнений' + name: Дополнения + description: Нажмите для отображения загруженных дополнений hooks: - name: 'Хуки' - description: 'Нажмите для отображения загруженных хуков' + name: Хуки + description: Нажмите для отображения загруженных хуков actions: reload: - name: 'Перезагрузка' - description: 'Нажмите дважды для перезагрузки BentoBox' + name: Перезагрузка + description: Нажмите дважды для перезагрузки BentoBox buttons: catalog: - name: 'Каталог дополнений' - description: 'Открывает каталог дополнений' + name: Каталог дополнений + description: Открывает каталог дополнений credits: - name: 'Титры' - description: 'Открывает титры BentoBox' + name: Титры + description: Открывает титры BentoBox empty-here: - name: 'Кажется, здесь ничего нет...' - description: 'Что, если вы посмотрите наш каталог?' + name: Кажется, здесь ничего нет... + description: Что, если вы посмотрите наш каталог? information: state: - name: 'Совместимость' + name: Совместимость description: - COMPATIBLE: | + COMPATIBLE: |- Запущена [name] [version]. BentoBox в настоящее время запущен на @@ -1903,14 +1987,14 @@ management: Его функции полностью разработаны для работы в этой среде. - SUPPORTED: | + SUPPORTED: |- Запущена [name] [version]. BentoBox в настоящее время запущен на ПОДДЕРЖИВАЕМОЙ версии серверного ПО Большинство функций работают как надо в этой среде - NOT_SUPPORTED: | + NOT_SUPPORTED: |- Запущена [name] [version]. BentoBox в настоящее время запущен на @@ -1919,7 +2003,7 @@ management: Хотя большинство функций все равно будут работать корректно, специфичные для версии баги или иные проблемы вполне вероятны. - INCOMPATIBLE: | + INCOMPATIBLE: |- Запущена [name] [version]. BentoBox в настоящее время запущен на @@ -1935,17 +2019,17 @@ catalog: title: Каталог дополнений views: gamemodes: - name: 'Игровые режимы' - description: | + name: Игровые режимы + description: |- Нажмите для просмотра доступных официальных игровых режимов. addons: - name: 'Дополнения' - description: | + name: Дополнения + description: |- Нажмите для просмотра доступных официальных дополнений. icon: - description-template: | + description-template: |- [topic] [install] @@ -1955,9 +2039,10 @@ catalog: на последний релиз. already-installed: Уже установлено! install-now: Установлено! + empty-here: - name: 'Кажется, здесь ничего нет...' - description: | + name: Кажется, здесь ничего нет... + description: |- BentoBox не подключен к GitHub. Позвольте BentoBox подключиться к GitHub в @@ -1996,110 +2081,125 @@ enums: KILL: Убийство SONIC_BOOM: Звуковой удар WORLD_BORDER: Граница мира + panel: credits: - title: '[name] Титры' + title: [name] Титры contributor: - name: '[name]' + name: [name] description: 'Коммиты: [commits]' empty-here: - name: 'Кажется, здесь ничего нет...' - description: | + name: Кажется, здесь ничего нет... + description: |- BentoBox не смог найти участников для этого дополнения. Позвольте BentoBox подключиться к GitHub в конфигурации или попробуйте позднее. +# В этом разделе приведены значения для панелей BentoBox. panels: + # Раздел переводов, используемых в панели дома. island_homes: - title: 'Ваши [prefix_island] дома' + title: Ваши [prefix_island] дома buttons: - name: '[name]' + # Эта кнопка служит для отображения островов, на которые можно телепортироваться. + name: [name] + # Раздел переводов, используемых в панели создания island_creation: - title: 'Выберите [prefix_an-island]' + title: Выберите [prefix_an-island] buttons: + # Эта кнопка служит для отображения набора чертежей на панели создания острова. bundle: - name: '[name]' + name: [name] description: '[description]' - uses: 'Использовано [number]/[max]' - unlimited: 'Неограниченное количество использований разрешено' + uses: Использовано [number]/[max] + unlimited: Неограниченное количество использований разрешено cost: 'Стоимость: [cost]' language: - title: 'Выберите ваш язык' - edited: 'Изменено на [lang]' + title: Выберите ваш язык + edited: Изменено на [lang] buttons: + # Эта кнопка служит для отображения различных языковых настроек, доступных на панели выбора языка. language: - name: '[name]' + name: [name] description: |- [authors] |[selected] - authors: 'Авторы:' - author: '- [name]' - selected: 'В данный момент выбрано.' + authors: Авторы: + author: - [name] + selected: Выбрано в данный момент. + # Раздел переводов, используемый на панели «Предпросмотра заполнителей» (список дополнений верхнего уровня) placeholder: - title: 'Браузер заполнителей' + title: Предпросмотр заполнителей buttons: + # Кнопка, представляющая группу заполнителей ядра BentoBox. bentobox: - name: 'BentoBox' - description: '[number] заполнителей' + name: BentoBox + description: [number] заполнителей + # Кнопка, представляющая группу-заполнитель для одного аддона; [name] = название аддона, [number] = количество. addon: - name: '[name]' - description: '[number] заполнителей' + name: [name] + description: [number] заполнителей + # Раздел переводов, используемый на панели «Список заполнителей» (список заполнителей для каждого источника) placeholder-list: - title: '[name]' + title: [name] buttons: + # LEAF — один заполнитель; [placeholder] = полная строка %expansion_id_key% leaf: - name: '[placeholder]' - description: '[description]' - disabled: '(отключено)' - hint: 'Нажмите для переключения.' + name: [placeholder] + description: [description] + disabled: (отключено) + hint: Нажмите для переключения. + # FOLDER — группа подзаполнителей; [label] = сжатый сегмент, [count] = общее количество элементов folder: - name: '[label]' - description: '[count] заполнителей' - hint: 'Нажмите для просмотра.' + name: [label] + description: [count] заполнителей + hint: Нажмите для просмотра. + # LEAF_FOLDER — заполнитель и папка; нажмите ЛКМ, чтобы переключить, нажмите ПКМ, чтобы открыть. leaf-folder: - hint: 'ЛКМ для переключения. · ПКМ для просмотра.' + hint: ЛКМ для переключения. · ПКМ для просмотра. + # СЕРИЯ — свернутый числовой ряд; [placeholder] содержит {N}, [count]/[min]/[max] = информация о диапазоне. series: - name: '[placeholder]' - description: '[description]' + name: [placeholder] + description: [description] range: '#[min] – #[max] · [count] элементов' - disabled: '(некоторые отключены)' - hint: 'Нажмите для переключения всех.' - sample: '#[index] → [value]' - sample-empty: '#[index] → (пусто)' + disabled: (некоторые отключены) + hint: Нажмите для переключения всех. + # Примеры значений для ряда; [index] = числовой суффикс, [value] = вычисленное значение. + sample: #[index] → [value] + sample-empty: #[index] → (пусто) + # LEAF_SERIES — заполнитель и серия; нажмите ЛКМ, чтобы переключить отображение листа, нажмите ПКМ, чтобы переключить отображение всех. leaf-series: - hint: 'ЛКМ для переключения. · ПКМ для переключения всех.' - value: '[value]' - value-empty: '(пусто)' + hint: ЛКМ для переключения. · ПКМ для переключения всех. + # Текущее значение заполнителя для проигрывателя просмотра. + value: [value] + value-empty: (пусто) back: - name: 'Назад' - description: 'Вернуться к списку аддонов' + name: Назад + description: Вернуться к списку аддонов + # Набор общих кнопок, используемых на нескольких панелях. buttons: + # Кнопка, используемая в интерфейсах, которая позволяет вернуться на предыдущую страницу. previous: - name: 'Предыдущая страница' - description: 'Перейти на [number] страницу' + name: Предыдущая страница + description: Перейти на [number] страницу + # Кнопка, используемая в интерфейсах, которая позволяет перейти на следующую страницу. next: - name: 'Следующая страница' - description: 'Перейти на [number] страницу' + name: Следующая страница + description: Перейти на [number] страницу tips: - click-to-next: 'Нажмите , чтобы продолжить.' - click-to-previous: 'Нажмите для предыдущего.' - click-to-choose: 'Щелкните , чтобы выбрать.' - click-to-toggle: 'Нажмите , чтобы переключить.' - left-click-to-cycle-down: 'Левый Щелчок , чтобы прокрутить вниз.' - right-click-to-cycle-up: 'Щелкните правой кнопкой мыши , чтобы прокрутить вверх.' -successfully-loaded: > - - ____ _ ____ + click-to-next: Нажмите, чтобы перейти на следующую страницу. + click-to-previous: Нажмите, чтобы перейти на предыдущую страницу. + click-to-choose: Нажмите, чтобы выбрать. + click-to-toggle: Нажмите, чтобы переключить. + left-click-to-cycle-down: ЛКМ, чтобы прокрутить вниз. + right-click-to-cycle-up: ПКМ, чтобы прокрутить вверх. - | _ \ | | | _ \ by tastybento and - Poslovitch - - | |_) | ___ _ __ | |_ ___ | |_) | _____ __ 2017 - 2023 +successfully-loaded: |2 + ____ _ ____ + | _ \ | | | _ \ автор tastybento и Poslovitch + | |_) | ___ _ __ | |_ ___ | |_) | _____ __ 2017 - 2026 | _ < / _ \ '_ \| __/ _ \| _ < / _ \ \/ / - | |_) | __/ | | | || (_) | |_) | (_) > < v[version] - - |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Загружено за [time] - ms. + |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Загружено за [time] мс. From 2e5aaefd6573cc5193c2b3c2e3d20c9f12051a17 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 20:04:49 -0700 Subject: [PATCH 76/95] Fix bold (and other decorations) leaking across legacy round-trip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adventure's LegacyComponentSerializer does not emit §r when a sibling component clears a decoration that was set on a previous sibling, because legacy color codes have no "decoration off" code. The User.getTranslation → convertToLegacy → PanelItem.setDescription → parseMiniMessageOrLegacy round-trip then re-parses the legacy string under legacy semantics (decorations persist until §r), so bold leaked into following segments. Replace componentToLegacy with a Component walker that tracks emitted state and inserts §r at decoration-off transitions, re-applying color afterwards. Strengthen the existing round-trip test to assert that bold only applies to the intended segment. Fixes #2917 Co-Authored-By: Claude Opus 4.6 --- .../world/bentobox/bentobox/util/Util.java | 133 +++++++++++++++++- .../util/LegacyToMiniMessageTest.java | 20 +++ 2 files changed, 152 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/bentobox/util/Util.java b/src/main/java/world/bentobox/bentobox/util/Util.java index cb934bfa7..9ada6ce19 100644 --- a/src/main/java/world/bentobox/bentobox/util/Util.java +++ b/src/main/java/world/bentobox/bentobox/util/Util.java @@ -49,6 +49,11 @@ import org.eclipse.jdt.annotation.Nullable; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -1327,7 +1332,133 @@ public static String convertInlineCommandsToMiniMessage(@NonNull String message) */ @NonNull public static String componentToLegacy(@NonNull Component component) { - return SECTION_SERIALIZER.serialize(component); + StringBuilder sb = new StringBuilder(); + // EmittedState[0] holds the last-emitted style (color + decorations) so the walker + // can compute transitions and emit §r where Adventure's serializer would not. + EmittedState state = new EmittedState(); + appendComponentLegacy(sb, component, Style.empty(), state); + return sb.toString(); + } + + /** + * Mutable state used by {@link #appendComponentLegacy(StringBuilder, Component, Style, EmittedState)} + * to track the most recently emitted color and decorations. Adventure's + * {@link LegacyComponentSerializer} silently drops decoration-off transitions because legacy + * color codes have no "turn this decoration off" code — only §r resets everything. We work + * around that by tracking what is currently active and emitting §r ourselves when needed. + */ + private static final class EmittedState { + TextColor color; + boolean bold; + boolean italic; + boolean underlined; + boolean strikethrough; + boolean obfuscated; + boolean isFresh = true; + } + + private static void appendComponentLegacy(StringBuilder sb, Component component, Style inherited, EmittedState state) { + // merge() with default strategy lets the child component override inherited fields, + // and inherits the parent's fields where the child leaves them unset. + Style effective = inherited.merge(component.style()); + if (component instanceof TextComponent text && !text.content().isEmpty()) { + emitStyleTransition(sb, effective, state); + sb.append(text.content()); + } + for (Component child : component.children()) { + appendComponentLegacy(sb, child, effective, state); + } + } + + private static void emitStyleTransition(StringBuilder sb, Style style, EmittedState state) { + boolean wantBold = style.decoration(TextDecoration.BOLD) == TextDecoration.State.TRUE; + boolean wantItalic = style.decoration(TextDecoration.ITALIC) == TextDecoration.State.TRUE; + boolean wantUnderlined = style.decoration(TextDecoration.UNDERLINED) == TextDecoration.State.TRUE; + boolean wantStrikethrough = style.decoration(TextDecoration.STRIKETHROUGH) == TextDecoration.State.TRUE; + boolean wantObfuscated = style.decoration(TextDecoration.OBFUSCATED) == TextDecoration.State.TRUE; + TextColor wantColor = style.color(); + + // Determine if we need a hard reset: any decoration that was on must turn off, + // or the color must change to "no color" while one was previously active. + boolean needReset = (state.bold && !wantBold) + || (state.italic && !wantItalic) + || (state.underlined && !wantUnderlined) + || (state.strikethrough && !wantStrikethrough) + || (state.obfuscated && !wantObfuscated) + || (state.color != null && wantColor == null); + + if (needReset) { + sb.append(COLOR_CHAR).append('r'); + state.color = null; + state.bold = false; + state.italic = false; + state.underlined = false; + state.strikethrough = false; + state.obfuscated = false; + } + + // Emit color if it changed (or after a reset) + if (wantColor != null && (state.isFresh || !wantColor.equals(state.color) || needReset)) { + sb.append(legacyColorCode(wantColor)); + state.color = wantColor; + } + + // Emit decorations that should now be on but aren't yet + if (wantBold && !state.bold) { + sb.append(COLOR_CHAR).append('l'); + state.bold = true; + } + if (wantItalic && !state.italic) { + sb.append(COLOR_CHAR).append('o'); + state.italic = true; + } + if (wantUnderlined && !state.underlined) { + sb.append(COLOR_CHAR).append('n'); + state.underlined = true; + } + if (wantStrikethrough && !state.strikethrough) { + sb.append(COLOR_CHAR).append('m'); + state.strikethrough = true; + } + if (wantObfuscated && !state.obfuscated) { + sb.append(COLOR_CHAR).append('k'); + state.obfuscated = true; + } + state.isFresh = false; + } + + private static String legacyColorCode(TextColor color) { + // For named colors, use the standard single-character legacy code. + NamedTextColor named = NamedTextColor.nearestTo(color); + char code; + if (named == NamedTextColor.BLACK) code = '0'; + else if (named == NamedTextColor.DARK_BLUE) code = '1'; + else if (named == NamedTextColor.DARK_GREEN) code = '2'; + else if (named == NamedTextColor.DARK_AQUA) code = '3'; + else if (named == NamedTextColor.DARK_RED) code = '4'; + else if (named == NamedTextColor.DARK_PURPLE) code = '5'; + else if (named == NamedTextColor.GOLD) code = '6'; + else if (named == NamedTextColor.GRAY) code = '7'; + else if (named == NamedTextColor.DARK_GRAY) code = '8'; + else if (named == NamedTextColor.BLUE) code = '9'; + else if (named == NamedTextColor.GREEN) code = 'a'; + else if (named == NamedTextColor.AQUA) code = 'b'; + else if (named == NamedTextColor.RED) code = 'c'; + else if (named == NamedTextColor.LIGHT_PURPLE) code = 'd'; + else if (named == NamedTextColor.YELLOW) code = 'e'; + else code = 'f'; + // If the original color was a true hex (not a named color), emit the §x§R§R... form + // so it round-trips. Otherwise just emit the named code. + if (!(color instanceof NamedTextColor)) { + String hex = String.format("%06X", color.value()); + StringBuilder out = new StringBuilder(); + out.append(COLOR_CHAR).append('x'); + for (int i = 0; i < 6; i++) { + out.append(COLOR_CHAR).append(hex.charAt(i)); + } + return out.toString(); + } + return COLOR_CHAR + Character.toString(code); } /** diff --git a/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java index 5388cb111..84cec3f62 100644 --- a/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java +++ b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -93,6 +94,25 @@ void testRoundTripDoesNotProduceLiteralTags() { assertFalse(plainText.contains(""), "Round-trip should not produce literal : " + plainText); assertEquals("Resets ALL the settings to their", plainText); + + // Inspect the children of the round-tripped component: only the "ALL " segment + // may be bold. Bold must NOT leak into "the settings to their". + StringBuilder boldText = new StringBuilder(); + collectBoldText(finalComp, false, boldText); + assertEquals("ALL ", boldText.toString(), + "Bold should only apply to 'ALL ', not leak into following segments"); + } + + private static void collectBoldText(Component component, boolean inheritedBold, StringBuilder out) { + TextDecoration.State state = component.decoration(TextDecoration.BOLD); + boolean effective = state == TextDecoration.State.TRUE + || (state == TextDecoration.State.NOT_SET && inheritedBold); + if (component instanceof net.kyori.adventure.text.TextComponent text && effective) { + out.append(text.content()); + } + for (Component child : component.children()) { + collectBoldText(child, effective, out); + } } /** From 108514328e467307a411db13f329c82d118a8ecf Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 20:08:17 -0700 Subject: [PATCH 77/95] Add round-trip leak test for italic, underlined, strikethrough, obfuscated The decoration leak fixed in the previous commit affected all five decorations equally, not just bold. Lock that in with a parameterised test that verifies each decoration in turn. Co-Authored-By: Claude Opus 4.6 --- .../util/LegacyToMiniMessageTest.java | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java index 84cec3f62..b1ea013b4 100644 --- a/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java +++ b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java @@ -104,14 +104,51 @@ void testRoundTripDoesNotProduceLiteralTags() { } private static void collectBoldText(Component component, boolean inheritedBold, StringBuilder out) { - TextDecoration.State state = component.decoration(TextDecoration.BOLD); + collectDecoratedText(component, TextDecoration.BOLD, inheritedBold, out); + } + + private static void collectDecoratedText(Component component, TextDecoration deco, boolean inherited, StringBuilder out) { + TextDecoration.State state = component.decoration(deco); boolean effective = state == TextDecoration.State.TRUE - || (state == TextDecoration.State.NOT_SET && inheritedBold); + || (state == TextDecoration.State.NOT_SET && inherited); if (component instanceof net.kyori.adventure.text.TextComponent text && effective) { out.append(text.content()); } for (Component child : component.children()) { - collectBoldText(child, effective, out); + collectDecoratedText(child, deco, effective, out); + } + } + + /** + * The same round-trip leak that affected bold also affected italic, underlined, strikethrough, + * and obfuscated, because Adventure's LegacyComponentSerializer never emits §r when *any* + * decoration transitions from on to off across siblings. Verify each decoration in turn. + */ + @Test + void testRoundTripNoDecorationLeaksAcrossSiblings() { + TextDecoration[] decos = { + TextDecoration.BOLD, + TextDecoration.ITALIC, + TextDecoration.UNDERLINED, + TextDecoration.STRIKETHROUGH, + TextDecoration.OBFUSCATED + }; + String[] tags = {"bold", "italic", "underlined", "strikethrough", "obfuscated"}; + + for (int i = 0; i < decos.length; i++) { + String tag = tags[i]; + String original = "before <" + tag + ">MID after"; + Component comp = Util.parseMiniMessage(original); + String legacy = Util.componentToLegacy(comp); + Component finalComp = Util.parseMiniMessageOrLegacy(legacy); + + String plainText = PlainTextComponentSerializer.plainText().serialize(finalComp); + assertEquals("before MID after", plainText, "plain text mismatch for " + tag); + + StringBuilder decoratedText = new StringBuilder(); + collectDecoratedText(finalComp, decos[i], false, decoratedText); + assertEquals("MID ", decoratedText.toString(), + tag + " should only apply to 'MID ', not leak into following segments"); } } From 315b8f81412d74010094701eb24e08971710d2a0 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 6 Apr 2026 20:10:39 -0700 Subject: [PATCH 78/95] Document MiniMessage/legacy round-trip pitfall in CLAUDE.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note that Util.componentToLegacy is intentionally a custom walker, not a wrapper around Adventure's LegacyComponentSerializer, because Adventure never emits §r when a sibling clears a decoration. This caused #2917 (bold and other decorations leaking into following lore segments). Co-Authored-By: Claude Opus 4.6 --- CLAUDE.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 736152c2a..c23cc2c9d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -118,6 +118,14 @@ public ImmutableSet getMemberSet() { ... } Guava (`ImmutableSet`, `ImmutableList`, etc.) is reliably available at runtime via Paper's bundled JARs and is safe to use in the public API. +## MiniMessage / legacy color round-trip + +`User.getTranslation()` returns a legacy `§`-coded string for backwards compatibility, even when the locale entry is MiniMessage. UI code (`PanelItem.setDescription`, etc.) then re-parses that legacy string back into a Component via `Util.parseMiniMessageOrLegacy`. This MiniMessage → Component → legacy → Component round-trip is lossy by default because of an Adventure quirk: + +**Adventure's `LegacyComponentSerializer` never emits `§r` to turn off a decoration when a sibling component clears it.** Legacy color codes have no "decoration off" code — only `§r` resets — but Adventure simply omits the decoration code on the next sibling instead of resetting. When that legacy string is re-parsed under correct legacy semantics (decorations persist until `§r`), the decoration leaks into the following segment. This bit bold, italic, underlined, strikethrough, and obfuscated equally (#2917). + +`Util.componentToLegacy` is therefore **not** a thin wrapper around Adventure's serializer — it's a custom Component walker (`appendComponentLegacy` / `emitStyleTransition`) that tracks the last-emitted color and decorations and inserts `§r` whenever any decoration was on and is now off, then re-applies color afterwards. **Do not replace it with `LegacyComponentSerializer.serialize()` directly** without re-introducing the leak. The round-trip is exercised by `LegacyToMiniMessageTest`. + ## Build Notes - The Gradle build uses the Paper `userdev` plugin and Shadow plugin to produce a fat/shaded JAR at `build/libs/BentoBox-{version}.jar`. From 173a7b28117310253ccc3620e63df477a756f42b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:10:31 +0000 Subject: [PATCH 79/95] Initial plan From b9d687f933ec929cbd05995e9d0e724a65b934ed Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 7 Apr 2026 10:14:34 -0700 Subject: [PATCH 80/95] Update Russian text --- src/main/resources/locales/ru.yml | 537 +++++++++++++++--------------- 1 file changed, 271 insertions(+), 266 deletions(-) diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index 2eb98b41b..6603f43cc 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -5,8 +5,8 @@ meta: authors: - - Moltanica_ - - Vinrey123 + - Moltanica_ + - Vinrey123 banner: BLUE_BANNER:1:STRIPE_RIGHT:WHITE:STRIPE_LEFT:RED prefixes: @@ -19,7 +19,8 @@ prefixes: general: success: Успешно! invalid: Некорректно - beta: Эта команда в бета-версии. Убедитесь, что у вас есть резервные копии! + beta: Эта команда в бета-версии. Убедитесь, что у вас есть резервные + копии! errors: command-cancelled: Команда отменена. no-permission: У вас нет разрешения на извлечение этой команды ([permission]). @@ -31,16 +32,19 @@ general: player-has-island: Игрок уже имеет острова! player-has-no-island: Этот игрок не имеет острова! already-have-island: У вас уже есть остров! - no-safe-location-found: Не удалось найти безопасное место при телепортации на остров. + no-safe-location-found: Не удалось найти безопасное место при телепортации + на остров. not-owner: Вы не являетесь владельцем этого острова! player-is-not-owner: [name] не является владельцем острова! not-in-team: Этот игрок не состоит в вашей команде! offline-player: Указанный игрок не в сети либо не существует. unknown-player: Не обнаружена игрока с ником [name]! general: Эта команда ещё не готова - свяжитесь с администрацией. - unknown-command: Неизвестная команда. Введите /[label] help для помощи. + unknown-command: Неизвестная команда. Введите /[label] help для + помощи. wrong-world: Вы находитесь в неправильном мире для совершения действия! - you-must-wait: Вы должны подождать [number] прежде чем пробовать команду снова. + you-must-wait: Вы должны подождать [number] прежде чем пробовать команду + снова. must-be-positive-number: [number] не является корректным положительным значением. not-on-island: Вы не на острове! slow-down: Помедленнее... @@ -52,11 +56,11 @@ general: commands: # Параметры в <> являются обязательными, параметры в [] — необязательными. help: - header: =========== [label] помощь =========== + header: =========== [label] помощь =========== syntax: '[usage] [parameters]: [description]' syntax-no-parameters: '[usage]: [description]' end: ================================= - page: Страница [page] из [total] + page: Страница [page] из [total] parameters: '[command]' description: команда помощи console: Консоль @@ -66,70 +70,66 @@ commands: maxhomes: description: измените количество домов, разрешенных на этом [prefix_island] или у игрока [prefix_island] - parameters: [[prefix_island] имя] + parameters: <число / игрок> <число> [имя [prefix_island]а] max-homes-set: [name] - Установить [prefix_island] максимальное количество домов на [number] errors: unknown-island: Неизвестный [prefix_island]! [name] resethome: description: Сбросить домашнюю точку игрока к умолчанию - parameters: <игрок> [[префикс_острова] имя] + parameters: <игрок> [имя] cleared: Сброс домашней точки. [name] resets: description: редактирует количество сбросов игрока set: description: устанавливает сколько раз игроки могут сбрасывать остров - parameters: <игрок> <сбрасывает> - success: Игрок [name]сбросил остров [number] - раза. + parameters: <игрок> <сбросы> + success: [name] сбросил остров [number] раз(а). reset: description: устанавливает количество сбросов игрока на 0 parameters: <игрок> - success-everyone: Успешно сброшено количество сбросов до 0. - success: Успешно сброшено количество сбросов игрока [name]до - 0. + success-everyone: Сброшено количество сбросов до 0. + success: Сброшено количество сбросов [name]до 0. add: - description: добавляет этому игроку указанное количество сбросов - parameters: <игрок> <сбрасывает> - success: Успешно добавлено [number] сбросов - игроку [name], увеличив общее количество сбросов до - [total]. + description: добавляет игроку указанное количество сбросов + parameters: <игрок> <сбросы> + success: Добавлен(о) [number] сброс(а/ов) [name], + увеличив общее количество сбросов до [total]. remove: description: уменьшает количество сбросов острова у игрока - parameters: <игрок> <сбрасывает> - success: Успешно уменьшено количество сбросов на [number] - у игрока [name] , уменьшив общее - количество сбросов до значения [total]. + parameters: <игрок> <сбросы> + success: Уменьшено количество сбросов на [number] у [name], + уменьшив общее количество сбросов до [total]. purge: parameters: '[days]' description: стирает остров, заброшенный на более чем [days] дней days-one-or-more: Должно быть хотя бы 1 или больше - purgable-islands: Найдено [number] подходящих - для очистки островов. + purgable-islands: Найден(о) [number] подходящ(ий/их) для + очистки остров(а/ов). too-many: |- Это много, и это может занять очень много времени для удаления. - Рассмотрите возможность использования плагина Regionerator для удаления чанков мира - и установки keep-previous-island-on-reset: true в config.yml BentoBox. + Рассмотрите возможность использования плагина Regionerator для удаления чанков мира + и установки keep-previous-island-on-reset: true в config.yml BentoBox. Затем выполните очистку. - purge-in-progress: Очистка в процессе. Используйте /[label] - purge stop для отмены. + purge-in-progress: Очистка в процессе. Используйте /[label] purge + stop для отмены. scanning: Сканирование островов в базе данных. Это может занять некоторое - время в зависимости от того, сколько у вас количество... + время в зависимости от того, сколько у вас количество... scanning-in-progress: Сканирование в процессе, пожалуйста, подождите none-found: Не найдено островов для очистки. total-islands: У вас [number] островов в вашей базе данных во всех мирах. number-error: Значение должно быть количеством дней - confirm: Введите /[label] purge confirm для - начала очистки. + confirm: Введите /[label] purge confirm для начала + очистки. completed: Очистка остановлена. see-console-for-status: Очистка начата. Смотрите в консоль для статуса - или используйте /[label] purge status. + или используйте /[label] purge status. no-purge-in-progress: В данный момент очистка не проводится. regions: parameters: '[days]' description: очистка островов путём удаления старых файлов регионов - confirm: Тип /[label] purge regions confirm - чтобы начать чистку + confirm: Тип /[label] purge regions confirm чтобы + начать чистку. protect: description: переключатель защиты острова от очистки move-to-island: Для начала вернитесь на остров! @@ -140,12 +140,12 @@ commands: stopping: Очистка остановлена unowned: description: позволяет очистить острова без владельцев - unowned-islands: Найдено [number] остров - без владельца. + unowned-islands: Найден(о) [number] остров(а/ов) без + владельца. status: description: отображает статус очистки - status: [purged] островов очищено из [purgeable] - ([percentage] %). + status: [purged] островов очищено из [purgeable] + ([percentage]%). team: description: управление командой add: @@ -153,15 +153,15 @@ commands: description: добавляет игрока в команду владельца name-not-owner: [name] не является владельцем. name-has-island: [name] имеет или имел остров. Разрегистрируйте или удалите - его сначала! - success: [name] был успешно добавлен на остров игрока - [owner]. + его! + success: [name] был успешно добавлен на остров игрока + [owner]. disband: parameters: <владелец> description: распустить команду владельца острова use-disband-owner: Не владелец! Используйте disband [owner]. disbanded: Администратор распустил вашу команду! - success: Команда игрока [name] была распущена. + success: Команда игрока [name] была распущена. fix: description: сканирует и исправляет присутствие на более чем 1 острове одновременно scanning: Сканируем базу данных... @@ -178,7 +178,7 @@ commands: cannot-kick-owner: Вы не можете выгнать владельца. Сначала выгоните участников. not-in-team: Этот игрок не в вашей команде. admin-kicked: Администратор выгнал вас из команды. - success: [name] был выгнан с острова игрока [owner]. + success: [name] был выгнан с острова игрока [owner]. success-all: Игрок удалён из всех команд в этом мире setowner: parameters: <игрок> @@ -187,24 +187,24 @@ commands: must-be-on-island: Вы должны быть на [prefix_island], чтобы установить владельца confirmation: Вы уверены, что хотите сделать [name] владельцем [prefix_island] - на [xyz]? - success: [name] теперь является владельцем острова. + на [xyz]? + success: [name] теперь является владельцем острова. extra-islands: 'Внимание: у этого игрока теперь есть [number] островов. - Это больше, чем разрешено настройками или правами: [max].' + Это больше, чем разрешено настройками или правами: [max].' maxsize: parameters: <игрок> <размер> description: установить максимальный размер команды для [prefix_island] игрока (0 для сброса к мировому значению по умолчанию) - success: Установлен максимальный размер команды [name] - для [prefix_island] на [number]. - reset: Сброшен максимальный размер команды [name] - для [prefix_island] до мирового значения по умолчанию ([number]). + success: Установлен максимальный размер команды [name] для + [prefix_island] на [number]. + reset: Сброшен максимальный размер команды [name] для + [prefix_island] до мирового значения по умолчанию ([number]). range: description: команда администратора по управлению областью острова invalid-value: - too-low: Радиус острова должен быть больше 1! - too-high: Радиус острова должен быть равен или меньше чем [number]! - same-as-before: Радиус острова уже установлен в значении [number]! + too-low: Радиус острова должен быть больше 1! + too-high: Радиус острова должен быть равен или меньше чем [number]! + same-as-before: Радиус острова уже установлен в значении [number]! display: already-off: Индикаторы уже выключены already-on: Индикаторы уже включены @@ -213,40 +213,40 @@ commands: hint: |- Красные иконки барьера показывают текущую границу острова. Серые частицы показывают максимально возможную область. - Зеленые частицы показывают границу по умолчанию, если текущая область отличается от таковой. + Зеленые частицы показывают границу по умолчанию, если текущая область отличается от таковой. showing: Отображение индикаторов области set: - parameters: + parameters: <игрок> <радиус> description: устанавливает радиус острова - success: Установлен радиус острова [number]. + success: Установлен радиус острова [number]. reset: parameters: <игрок> description: сбрасывает радиус острова до значения по умолчанию - success: Радиус острова сброшен до значения [number]. + success: Радиус острова сброшен до значения [number]. add: description: увеличивает радиус острова - parameters: - success: Радиус острова игрока [name] успешно - увеличен до значения [total] (+[number]). + parameters: <игрок> <радиус> + success: Радиус острова игрока [name] успешно увеличен + до [total] (+[number]). remove: description: уменьшает радиус острова - parameters: - success: Радиус острова игрока [name] успешно - уменьшен до значения [total] (-[number]). + parameters: <игрок> <радиус> + success: Радиус острова игрока [name] успешно уменьшен + до [total] (-[number]). register: parameters: <игрок> description: регистрирует игрока на острове без владельца, на котором вы находитесь registered-island: Игрок [name] зарегистрирован на острове, находящемся - на координатах [xyz]. + на координатах [xyz]. reserved-island: Остров на координатах [xyz] зарезервирован для [name]. already-owned: Остров уже принадлежит другому игроку! no-island-here: Здесь нет острова. Подтвердите для создания острова. in-deletion: Это пространство для острова уже было удалено. Попробуйте позднее. cannot-make-island: Остров не может быть размещён здесь, извините. Посмотрите - в консоль за возможными ошибками. + в консоль за возможными ошибками. island-is-spawn: Остров является спавном. Вы уверены? Введите команду - снова для подтверждения. + снова для подтверждения. unregister: parameters: <владелец> [x,y,z] description: разрегистрирует остров, но сохраняет блоки на острове @@ -290,18 +290,18 @@ commands: banned-players: 'Забаненные игроки:' banned-format: [name] unowned: Не владелец - bundle: 'Пакет чертежей, использованный для создания острова: [name]' + bundle: 'Пакет чертежей, использованный для создания острова: [name]' switch: description: переключатель вкл/выкл обхода защиты - op: Операторы сервера всегда имеют обход защиты. Снимите себя с операторства - и повторите снова. + op: Операторы сервера всегда имеют обход защиты. Снимите себя с операторства + и повторите снова. removing: Убираем защиту от обхода... adding: Добавляем защиту от обхода... switchto: parameters: <игрок> <число> description: причисляет остров игрока к мусорным островам - out-of-range: Номер должен быть между 1 и [number]. Используйте [label] - trash [player] для просмотра значений. + out-of-range: Номер должен быть между 1 и [number]. Используйте [label] + trash [player] для просмотра значений. cannot-switch: Переключение не удалось. Смотрите логи в консоли для поиска ошибки. success: Остров игрока успешно переключен в режим мусорного. @@ -311,11 +311,11 @@ commands: parameters: '[игрок]' description: показывает острова без владельца и мусорные острова title: =========== Мусорные острова =========== - count: Остров [number]: - use-switch: Используйте [label] switchto для - переключения к острову игрока - use-emptytrash: Используйте [label] emptytrash [player]для - постоянного удаления мусорных предметов + count: Остров [number]: + use-switch: Используйте [label] switchto для переключения + к острову игрока + use-emptytrash: Используйте [label] emptytrash [player] для постоянного + удаления мусорных предметов emptytrash: parameters: '[игрок]' description: Очистить мусор для игрока или все незащищенные острова в мусоре @@ -325,8 +325,7 @@ commands: setrange: parameters: <игрок> <диапазон> description: устанавливает радиус острова игрока - range-updated: Радиус острова игрока обновлен до значения [number] - . + range-updated: Радиус острова игрока обновлен до [number]. placeholders: description: открыть браузер заполнителей dump-placeholders: @@ -336,30 +335,31 @@ commands: reload: description: перезагрузка tp: - parameters: [player to teleport] + parameters: <игрок> [[prefix_island] игрока] description: телепорт на остров игрока - manual: Безопасная точка телепортации не обнаружена! Вручную телепортируйтесь - рядом с [location] и проверьте обстановку + manual: Безопасная точка телепортации не обнаружена! Вручную телепортируйтесь + рядом с [location] и проверьте обстановку tpuser: - parameters: <телепортирующийся игрок> <[prefix_island] игрока> [остров игрока] + parameters: <телепортирующийся игрок> <игрок [prefix_island]а> [[prefix_island] + игрока] description: телепортировать игрока на [prefix_island] другого игрока getrank: - parameters: [island owner] + parameters: <игрок> [владелец [prefix_island]а] description: отображает ранг игрока на его острове или острове владельца - rank-is: Ранг [rank] на острове игрока [name]. + rank-is: Ранг [rank] на острове игрока [name]. setrank: - parameters: [island owner] + parameters: <игрок> <ранг> [владелец [prefix_island]а] description: устанавливает ранг игрока на их острове или острове владельца unknown-rank: Неизвестный ранг! not-possible: Ранг должен быть больше чем у посетителя. - rank-set: Ранг установлен между [from] и - [to] на острове игрока [name]. + rank-set: Ранг установлен между [from] и [to] на + острове игрока [name]. setprotectionlocation: - parameters: '[x y z coords]' + parameters: '[x y z координаты]' description: устанавливает текущую локацию или координаты [x y z] как центральную точку острова - island: Это повлияет на остров игрока [name], находящийся на координатах - [xyz]. + island: Это повлияет на остров игрока [name], находящийся на координатах + [xyz]. confirmation: Вы уверены, что хотите установить [xyz] как центр острова? success: Успешно установлено [xyz] как центр острова. fail: Не удалось установить [xyz] как центр острова. @@ -377,7 +377,7 @@ commands: description: устанавливает текущую точку как точку спавна на указанном острове no-island-here: Здесь нет острова. confirmation: Вы уверен, что хотите сделать текущую точку как точку спавна - на указанном острове? + на указанном острове? success: Точка спавна на данном острове успешно установлена. island-spawnpoint-changed: [user] изменил точку спавна на своем острове. settings: @@ -386,14 +386,14 @@ commands: description: открывает окно настроек или выводит список unknown-setting: Неизвестная настройка blueprint: - parameters: + parameters: <загрузить/скопировать/вставить/pos1/pos2/сохранить> description: взаимодействие с планами bedrock-required: Как минимум 1 блок бедрока должен быть в плане! copy-first: Сначала скопируйте! file-exists: Файл уже существует, перезаписать? no-such-file: Нет нужного файла! could-not-load: Не удалось загрузить файл! - could-not-save: 'Хмм, что-то пошло не так при сохранении файла: [message]' + could-not-save: 'Хм, что-то пошло не так при сохранении файла: [message]' set-pos1: Позиция 1 установлена как [vector] set-pos2: Позиция 2 установлена как [vector] set-different-pos: Установите иную позицию - эта позиция уже установлена! @@ -404,24 +404,24 @@ commands: mid-copy: Вы в режиме копирования. Подождите ее окончания. copied-percent: Скопировано [number]% copy: - parameters: '[air]' + parameters: '[воздух] [биом] [нет воды]' description: скопируйте в буфер обмена установленные pos1, pos2 и, возможно, блоки возлуха sink: description: установите этот чертеж, чтобы он опустился на дно океана после вставки - status: Чертеж будет [status] при вставке + status: Чертёж будет [status] при вставке sink: погружаться на дно not-sink: не погружаться no-clipboard: В буфере обмена нет чертежа. Загрузите или скопируйте что-нибудь. delete: - parameters: + parameters: <имя> description: удалить план - no-blueprint: [name] не существует. + no-blueprint: [name] не существует. confirmation: |- Вы уверены, что хотите удалить этот план? После удаления нет возможности восстановить. - success: План [name] успешно удален. + success: План [name] успешно удален. load: parameters: <имя> description: загрузить план в буфер обмена @@ -439,14 +439,13 @@ commands: pos2: description: установить 2-й угол кубоидного буфера обмена save: - parameters: <синий план имя> + parameters: <имя чертежа> description: сохранить скопированное в буфере обмена rename: - parameters: <синий план> <новое имя> + parameters: <чертёж> <новое имя> description: переименовать план - success: План [old] был успешно переименован - в [display]. Название файла теперь [name] - . + success: План [old] был успешно переименован [display]. + Название файла теперь [name]. pick-different-name: Укажите имя, отличное от имени уже существующего плана. management: @@ -470,7 +469,7 @@ commands: no-perm-required: Невозможно установить разрешения для сборника по умолчанию perm-not-required: Не требуется perm-format: - remove: Правый клик для удаления + remove: ПКМ для удаления blueprint-instruction: |- Нажмите для выбора, затем добавьте в сборника. @@ -479,19 +478,19 @@ commands: new-bundle: Новый сборник new-bundle-instructions: Кликните для создания нового сборника name: - quit: выход - prompt: Введите имя, или 'quit' для выхода + quit: выйти + prompt: Введите имя, или "выйти" для выхода too-long: Слишком длинное имя. Установить можно до 32 знаков. pick-a-unique-name: Пожалуйста, выберите более уникальное имя. stripped-char-in-unique-name: Некоторые недопустимые символы удалены. - Новый ID будет [name] . + Новый ID будет [name]. success: Успех! conversation-prefix: '>' description: - quit: выход + quit: выйти instructions: |- введите многострочное описание для [name] - и 'quit' на линии, чтобы закончить. + и "выйти" на линии, чтобы закончить. default-color: '' success: Успех! cancelling: Отмена @@ -517,14 +516,14 @@ commands: edit-commands: Нажмите для редактирования команд no-commands: Команды не установлены commands: - quit: выход + quit: выйти clear: очистить instructions: |- Введите команды для выполнения при вставке чертежа [name]. Поддерживает заполнители [player] и [owner]. Добавьте [SUDO] для выполнения от имени игрока. - Введите 'очистить' для удаления всех команд в этой сессии. - Введите 'выход' на отдельной строке для завершения. + Введите "очистить" для удаления всех команд в этой сессии. + Введите "выйти" на отдельной строке для завершения. default-color: '' success: Успех! cancelling: Отмена @@ -541,7 +540,7 @@ commands: parameters: <игрок> description: удаление острова игрока cannot-delete-owner: Все участники острова будут изгнаны перед удалением. - deleted-island: Остров на координатах [xyz] успешно + deleted-island: Остров на координатах [xyz] успешно удален. deletehomes: parameters: <игрок> @@ -550,30 +549,30 @@ commands: why: parameters: <игрок> description: включить отчет об отладке защиты консоли - turning-on: Включен режим отладки в консоли для [name]. - turning-off: Выключен режим отладки в консоли для [name]. + turning-on: Включен режим отладки в консоли для [name]. + turning-off: Выключен режим отладки в консоли для [name]. deaths: description: редактирует количество смертей у игроков reset: description: сбрасывает количество смертей игрока parameters: <игрок> - success: Успешно сброшено количество смертей игрока [name] - до 0. + success: Успешно сброшено количество смертей игрока [name] до + 0. set: description: устанавливает количество смертей у игрока parameters: <игрок> <смерти> - success: Успешно установлено количество смертей игрока [name]на - значение [number] . + success: Успешно установлено количество смертей игрока [name] + на значение [number]. add: description: добавляет смерти игроку parameters: <игрок> <смерти> - success: [number] смертей успешно добавлено игроку [name], - увеличив общее количество до [total] смертей. + success: [number] смертей успешно добавлено игроку [name], увеличив + общее количество до [total] смертей. remove: description: убрать смерти у игрока parameters: <игрок> <смерти> - success: [number] смертей успешно убрано у игрока [name], - уменьшив общее количество до [total] смертей. + success: [number] смертей успешно убрано у игрока [name], + уменьшив общее количество до [total] смертей. resetname: description: сбрасывает название острова игрока success: Успешно сброшено имя острова [name]. @@ -591,25 +590,25 @@ commands: error: 'Не удалось записать список заполнителей: [message]' reload: description: перезагружает BentoBox и все аддоны, настройки и файлы локализации - locales-reloaded: '[prefix_bentobox]Языки обновлены.' + locales-reloaded: '[prefix_bentobox]Локализация обновлена.' addons-reloaded: '[prefix_bentobox]Дополнения перезагружены.' settings-reloaded: '[prefix_bentobox]Настройки перезагружены.' - addon: '[prefix_bentobox]Перезагрузка [name].' + addon: '[prefix_bentobox]Перезагрузка [name].' addon-reloaded: '[prefix_bentobox][name] перезагружен.' - warning: '[prefix_bentobox]Предупреждение: Перезагрузка может привести к нестабильной работе, так что если вы видите ошибки - перезагрузите сервер.' + warning: '[prefix_bentobox]Перезагрузка может привести к нестабильной работе, + так что если вы видите ошибки - перезагрузите сервер.' unknown-addon: '[prefix_bentobox]неизвестный аддон!' locales: description: перезагрузка файлов локализации version: - plugin-version: 'Версия BentoBox: [version]' + plugin-version: 'Версия BentoBox: [version]' description: отображает версию BentoBox и дополнений loaded-addons: 'Загруженные аддоны:' loaded-game-worlds: 'Загруженные миры:' - addon-syntax: [name] [version] ([state]) - game-world: '[name] ([addon]): - [worlds]' - server: Запущено [name] [version]. - database: 'База данных: [database]' + addon-syntax: [name] [version] ([state]) + game-world: '[name] ([addon]): [worlds]' + server: Запущено [name] [version]. + database: 'База данных: [database]' manage: description: отображает панель управления catalog: @@ -618,7 +617,7 @@ commands: description: выполняет анализ файлов локализации see-console: |- [prefix_bentobox]Проверьте консоль для получения обратной связи. - [prefix_bentobox]Эта команда так много спамит, что нельзя получить ответ в чате... + [prefix_bentobox]Эта команда так много спамит, что нельзя получить ответ в чате... migrate: description: мигрирует базу данных из одного места в другое players: '[prefix_bentobox]Миграция игроков' @@ -629,19 +628,19 @@ commands: completed: '[prefix_bentobox]Завершено' rank: description: список, добавить или удалить ранги - parameters: [list | add | remove] [ссылка на ранг] [значение ранга] + parameters: [список | добавить | удалить] [образец ранга] [значение ранг] add: success: Добавлено [rank] со значением [number] - failure: Не удалось добавить [rank] со значением [number]. Возможно, - дубликат? + failure: Не удалось добавить [rank] со значением [number]. Возможно, + дубликат? remove: success: Удалено [rank] failure: Не удалось удалить [rank]. Неизвестный ранг. list: Зарегистрированные ранги следующие: confirmation: - confirm: Введите команду снова в течение [seconds] секунд для подтверждения. + confirm: Подтвердите, повторив команду в течение [seconds] секунд. previous-request-cancelled: Предыдущий запрос на подтверждение был отменён. - request-cancelled: Время подтверждения истекло - запрос отменён. + request-cancelled: Время подтверждения истекло - запрос отменён. delay: previous-command-cancelled: Предыдущая команда была отменена stand-still: Не двигайтесь! Телепортация через [seconds] секунды @@ -650,13 +649,13 @@ commands: about: description: показать сведения о лицензии go: - parameters: '[дом имя]' + parameters: '[имя дома]' description: телепортация на свой остров teleport: Телепортируемся на ваш остров. in-progress: Телепортация в процессе, пожалуйста, подождите... - teleported: Вы успешно телепортировали на точку дома [number]. - failure: Телепортация не удалась по какой-то причине. Пожалуйста, попробуйте - снова позже. + teleported: Вы успешно телепортировали на точку дома [number]. + failure: Телепортация не удалась по какой-то причине. Пожалуйста, попробуйте + снова позже. unknown-home: Неизвестное название точки дома! help: description: основная команда режима @@ -666,9 +665,9 @@ commands: no-spawn: В этом режиме игры нет спавна. create: description: создайте остров, используя специальный план (требуется разрешение) - parameters: <синий план> + parameters: <чертёж> too-many-islands: 'В этом мире слишком много островов: здесь нет места - для создания вашего острова.' + для создания вашего острова.' cannot-create-island: Место не найдено в данный момент, попробуйте ещё раз позднее... unable-create-island: Ваш остров не был создан, свяжитесь с администрацией. @@ -676,13 +675,11 @@ commands: you-cannot-make: Вы не можете создать больше островов! max-uses: Вы не можете создать больше такого типа [prefix_island]! you-cannot-make-team: Участники команды не могут создавать острова в том - же мире, что и их команда [prefix_island]. + же мире, что и их команда [prefix_island]. pasting: - estimated-time: 'Расчетное время: [number] секунд.' - blocks: 'Строим блок за блоком: [number] блоков - всего...' - entities: 'Наполняем сущностями: [number] сущностей - всего...' + estimated-time: 'Расчетное время: [number] секунд.' + blocks: 'Строим блок за блоком: [number] блоков всего...' + entities: 'Наполняем сущностями: [number] сущностей всего...' dimension-done: Остров в [world] построен. done: Готово! Ваш остров готов и ожидает вас! pick: Выберите остров @@ -694,7 +691,7 @@ commands: когда вам будет угодно. deletehome: description: удалить точку дома - parameters: '[название дома]' + parameters: '[имя дома]' homes: description: список ваших точек дома info: @@ -704,28 +701,26 @@ commands: description: показывает название островов, находящихся рядом с вами parameters: '' the-following-islands: Следующие острова неподалеку: - syntax: '[direction]: [name]' + syntax: '[direction]: [name]' north: Север south: Юг east: Восток west: Запад no-neighbors: Островов поблизости не обнаружено! reset: - description: удаляет старый остров и дает новый - parameters: <чертеж> + description: удаляет старый остров и выдаёт новый + parameters: <чертёж> none-left: У вас больше не осталось сбросов! - resets-left: У вас осталось [number] сбросов - confirmation: |- - Вы уверены, что хотите сделать это? - Все участники будут удалены с острова, вам будет необходимо пригласить их заново. - Здесь нет пути назад: после удаления острова, у вас НЕ БУДЕТ возможности восстановить его. + resets-left: У вас осталось [number] сбросов + confirmation: Все участники будут удалены с острова. После удаления острова + восстановить его будет невозможно. kicked-from-island: Вы были удалены с острова в режиме [gamemode], так - как владелец сбросил его. + как владелец сбросил его. sethome: description: устанавливает точку телепортации дома must-be-on-your-island: Вы должны быть на своем острове для установки этого! - too-many-homes: Невозможно установить - вы достигли максимального количества - ([number]) точек дома. + too-many-homes: Невозможно установить - вы достигли максимального количества + ([number]) точек дома. home-set: Ваше местоположение на острове установлено как точка дома. homes-are: Точки дома на острове: home-list-syntax: [name] @@ -800,19 +795,19 @@ commands: hours: часов minutes: минут header: |- - --- Информация о команде --- - Участники: [total]/[max] - Онлайн: [online] + --- Информация о команде --- + Участники: [total]/[max] + Онлайн: [online] rank-layout: owner: [rank]: - generic: [rank] ([number]): + generic: [rank] ([number]): coop: description: создать кооперацию игроков на острове parameters: <игрок> cannot-coop-yourself: Вы не можете быть командой с собой! already-has-rank: Игрок уже имеет этот ранг! - you-are-a-coop-member: Вы уже скооперированы с [name]. - success: Вы скооперированы с [name]. + you-are-a-coop-member: Вы уже скооперированы с [name]. + success: Вы скооперированы с [name]. name-has-invited-you: [name] пригласил вас присоединиться к команде на его острове. uncoop: @@ -824,8 +819,8 @@ commands: you-are-no-longer-a-coop-member: Вы больше не в кооперации игроков на острове игрока [name] all-members-logged-off: Все участники острова вышли из сети, так что - вы больше не находитесь в кооперации на острове игрока [name]. - success: [name] больше не является участником кооперации + вы больше не находитесь в кооперации на острове игрока [name]. + success: [name] больше не является участником кооперации на вашем острове. is-full: Вы не можете больше добавлять в кооперацию. trust: @@ -835,10 +830,9 @@ commands: name-has-invited-you: [name] пригласил вас стать довереннным игроком на его острове. player-already-trusted: Игрок уже доверенный! - you-are-trusted: Игрок [name] сделал - вас доверенным! - success: Вы сделали игрока [name] доверенным. - is-full: Вы не можете доверять ещё кому-либо, лимит достигнут! + you-are-trusted: [name] сделал вас доверенным! + success: Вы сделали [name] доверенным. + is-full: Лимит на доверенных игроков достиг максимума! untrust: description: убрать статус доверенного игрока parameters: <игрок> @@ -846,23 +840,23 @@ commands: cannot-untrust-member: Вы не можете раздоверить участника player-not-trusted: Игрок больше не доверенный! you-are-no-longer-trusted: Вы больше не являетесь доверенным игроком - у [name] ! - success: [name] больше не является доверенным на вашему - острове. + у [name] ! + success: [name] больше не является доверенным на вашему + острове. invite: description: приглашает игрока посетить ваш остров - invitation-sent: Приглашение отправлено игроку [name]. + invitation-sent: Приглашение отправлено игроку [name]. removing-invite: Удаление приглашения. name-has-invited-you: [name] пригласил вас посетить его остров. to-accept-or-reject: Введите /[label] team accept чтобы принять либо - /[label] team reject для отказа - you-will-lose-your-island: ВНИМАНИЕ! Вы ПОТЕРЯЕТЕ ваш остров (вместе - с инвентарем) в случае принятия! + /[label] team reject для отказа. + you-will-lose-your-island: ВНИМАНИЕ! Вы потеряете свой остров в случае + принятия! gui: titles: team-invite-panel: Пригласить игроков button: - already-invited: Приглашен уже + already-invited: Уже приглашён search: Найти игрока searching: |- Поиск за @@ -886,21 +880,21 @@ commands: cannot-invite-self: Вы не можете пригласить самого себя! cooldown: Вы не можете пригласить этого игрока в течение [number] секунд. island-is-full: Ваш остров полон, вы не можете больше никого пригласить. - none-invited-you: Вас никто не пригласил :c. + none-invited-you: Вас никто не пригласил. you-already-are-in-team: Вы уже в команде! already-on-team: Этот игрок уже в команде! - invalid-invite: Приглашение больше не действует, извините. + invalid-invite: Приглашение больше не действует. you-have-already-invited: Вы уже пригласили этого игрока! parameters: <игрок> you-can-invite: Вы можете пригласить ещё [number] игроков. accept: description: принятие приглашения - you-joined-island: Вы присоединились к острову! Используйте /[label] - team чтобы видеть других участников. + you-joined-island: Вы присоединились к острову! Используйте /[label] + team чтобы видеть других участников. name-joined-your-island: [name] присоединился к вашему острову! confirmation: |- Вы уверены, что хотите принять это приглашение? - Вы ПОТЕРЯЕТЕ ваш текущий остров! + Вы ПОТЕРЯЕТЕ ваш текущий остров! reject: description: отказ от приглашения you-rejected-invite: Вы отклонили приглашение посетить остров. @@ -910,9 +904,9 @@ commands: остров leave: cannot-leave: Владелец не может покинуть остров! Сначала станьте участником, - или удалите всех участников. + или удалите всех участников. description: покинуть свой остров - left-your-island: [name] покинул ваш остров + left-your-island: [name] покинул ваш остров success: Вы покинули этот остров. kick: description: удалить участника с острова @@ -920,7 +914,7 @@ commands: player-kicked: [name] был удален с вашего острова в режиме [gamemode]! cannot-kick: Вы не можете удалить самого себя! cannot-kick-rank: Ваш статус не позволяет удалить игрока [name]! - success: [name] был удален с вашего острова. + success: [name] был удален с вашего острова. demote: description: понижает ранг игрока на вашем острове parameters: <игрок> @@ -942,12 +936,10 @@ commands: setowner: description: передать право собственности на остров участнику errors: - cant-transfer-to-yourself: Вы не можете передать остров самому себе! - (Хотя, по факту, вы можете... Но мы - не будем этого делать. Потому что это бессмысленно.) + cant-transfer-to-yourself: Вы не можете передать остров самому себе! target-is-not-member: Этот игрок не является частью вашей команды! - at-max: Этот игрок уже имеет максимальное количество островов, которое - ему разрешено! + at-max: Этот игрок уже имеет максимальное количество островов, которое + ему разрешено! name-is-the-owner: [name] теперь является владельцем острова! parameters: <игрок> you-are-the-owner: Вы теперь владелец острова! @@ -960,22 +952,22 @@ commands: cannot-ban-more-players: Вы достигли лимита банов, вы можете более банить игроков на острове. player-already-banned: Игрок уже забанен. - player-banned: [name]теперь забанен на вашем острове. - owner-banned-you: [name]забанил вас на своем острове! + player-banned: [name]теперь забанен на вашем острове. + owner-banned-you: [name]забанил вас на своем острове! you-are-banned: Вы забанены на этом острове! unban: description: разбанить игрока на острове parameters: <игрок> cannot-unban-yourself: Вы не можете разбанить самого себя! player-not-banned: Игрок не был забанен ранее. - player-unbanned: [name]разбанен на вашем острове. - you-are-unbanned: [name]разбанил вас на своем острове! + player-unbanned: [name]разбанен на вашем острове. + you-are-unbanned: [name]разбанил вас на своем острове! banlist: description: список забаненных игроков noone: Никто не забанен на этом острове. the-following: Следующие игроки забанены: names: [line] - you-can-ban: Вы можете забанить ещё [number] игроков. + you-can-ban: Вы можете забанить ещё [number] игроков. settings: description: отображает настройки острова language: @@ -990,8 +982,8 @@ commands: cannot-expel: Этот игрок не может быть выгнан. cannot-expel-member: Вы не можете выгнать участника группы! not-on-island: Этот игрок не на вашем острове! - player-expelled-you: [name] выгнал вас с острова! - success: Вы выгнали [name] с острова. + player-expelled-you: [name] выгнал вас с острова! + success: Вы выгнали [name] с острова. lock: description: заблокировать или разблокировать ваш [prefix_island] locked: Ваш [prefix_island] теперь заблокирован. @@ -1000,7 +992,7 @@ commands: ranks: owner: Владелец - sub-owner: Семи-владелец + sub-owner: Заместитель member: Участник trusted: Доверенный coop: Кооперация @@ -1074,16 +1066,16 @@ protection: name: Резная книжная полка description: |- Переключает взаимодействие - с резными книжными полками - hint: Взаимодействие с книжными полками запрещено! + с резной книжной полкой + hint: Взаимодействие с резной книжной полкой запрещено! BREAK_BLOCKS: name: Разрушение блоков description: Переключает разрушение блоков hint: Разрушение блоков запрещено! BREAK_SPAWNERS: - name: Разрушение рассадников - description: Переключает разрушение рассадников - hint: Разрушение рассадников запрещено! + name: Разрушение рассадника монстров + description: Переключает разрушение рассадника монстров + hint: Разрушение рассадника монстров запрещено! BREAK_HOPPERS: name: Разрушение воронок description: Переключает разрушение воронок @@ -1190,7 +1182,7 @@ protection: с точилом hint: Взаимодействие с точилом запрещено! SHULKER_BOX: - name: Шалкеровые ящики + name: Шалкеровый ящик description: |- Переключает взаимодействие с шалкеровым ящиком @@ -1381,7 +1373,7 @@ protection: FIRE_SPREAD: name: Распространение огня description: |- - Переключает огню распространяться + Переключает распространение огня на близлежащие блоки FISH_SCOOPING: name: Сбор рыбы @@ -1393,7 +1385,7 @@ protection: Переключает игрокам поджигать блоки или костры, используя огниво или огненный заряд - hint: Использование огнива запрещено! + hint: Использование огнива или огненного заряда запрещено! FURNACE: name: Печь description: |- @@ -1518,7 +1510,7 @@ protection: Учтите, что жидкости всё ещё будут течь вертикально. Они также не будут распространяться горизонтально - если расположены за границей острова. + если расположены за границей острова LOCK: name: Блокировка description: Переключает блокировку острова @@ -1584,30 +1576,29 @@ protection: cooldown: Подождите несколько секунд, чтобы зачерпнуть снова. obsidian-nearby: В радиусе [radius] блоков есть ещё обсидиан. OFFLINE_GROWTH: - name: Оффлайн рост + name: Офлайн-рост description: |- Когда отключено, растения - не будут пассивно расти - когда все участники не в сети. - Может снизить лаги. + не будут пассивно расти, + если все участники не в сети. + Может снизить лаги OFFLINE_REDSTONE: - name: Оффлайн редстоун + name: Офлайн-редстоун description: |- - Когда отключено, редстоун - механизмы не будут работать - когда все участники не в сети. - Может снизить лаги. + Когда отключено, редстоун-механизмы + не работают, если все участники не в сети. + Может снизить лаги PETS_STAY_AT_HOME: name: Питомцы остаются дома description: |- Когда активно, прирученные питомцы могут перемещаться только по вашему - острову и не могут его покинуть. + острову и не могут его покинуть PISTON_PUSH: name: Защита от толкания поршнями description: |- Включите это для предотвращения - толкания блоков за пределы острова. + толкания блоков за пределы острова PLACE_BLOCKS: name: Установка блоков description: Переключает установку блоков @@ -1787,7 +1778,7 @@ protection: description: |- Если включено, игроки, упавшие в пустоту, будут телепортированы обратно на точку - спавна вместо смерти. + спавна вместо смерти RAID_TRIGGER: name: Рейд description: |- @@ -1823,11 +1814,12 @@ protection: разрушать блоки и наносить урон сущностям за пределами острова locked: Этот остров заблокирован! - locked-island-bypass: Этот [prefix_island] заблокирован, но у вас есть разрешение на вход. + locked-island-bypass: Этот [prefix_island] заблокирован, но у вас есть разрешение + на вход. protected: 'Остров защищён: [description].' world-protected: 'Мир защищён: [description].' spawn-protected: 'Спавн защищён: [description].' - + panel: next: Следующая страница previous: Предыдущая страница @@ -1841,7 +1833,7 @@ protection: expert: name: Экспертные настройки description: Показывает все доступные настройки. - click-to-switch: Нажмите, для переключения [next]. + click-to-switch: Нажмите, чтобы переключить [next]. reset-to-default: name: Сбросить значение description: |- @@ -1863,16 +1855,24 @@ protection: description: | Настройки защиты для случаев, когда игроки вне их острова + ISLAND_DEFAULTS: + title: [world_name] по умолчанию + description: | + Настройки защиты по умолчанию + для новых [prefix_island]ов flag-item: name-layout: [name] # Добавляйте команды в этот список по мере необходимости. command-instructions: + lock: |- + Выберите ранг, который может + блокировать остров setname: |- Выберите ранг, который может установить имя ban: |- Выберите ранг, который может - банить игроков + банить игроков unban: |- Выберите ранг, который может разбанить игроков @@ -1922,7 +1922,7 @@ protection: [description]. ЛКМ для движения вниз. - ЛКМ для движения вверх. + ПКМ для движения вверх. Разрешено для: allowed-rank: - [rank] @@ -1931,15 +1931,15 @@ protection: menu-layout: |- [description]. - Нажмите для открытия. + Нажмите, чтобы открыть. setting-cooldown: Настройка на перезарядке setting-layout: |- [description]. - Нажмите для переключения. + Нажмите, чтобы переключить. Текущая настройка: [setting] - setting-active: Активно + setting-active: Включено setting-disabled: Отключено management: @@ -1948,13 +1948,14 @@ management: views: gamemodes: name: Игровые режимы - description: Нажмите для отображения загруженных игровых режимов + description: Нажмите для отображения загруженных игровых + режимов blueprints: name: Чертежи description: Открывает админское меню управления чертежами. gamemode: name: [name] - description: 'Острова: [islands]' + description: 'Острова: [islands]' addons: name: Дополнения description: Нажмите для отображения загруженных дополнений @@ -1964,7 +1965,8 @@ management: actions: reload: name: Перезагрузка - description: Нажмите дважды для перезагрузки BentoBox + description: Нажмите дважды для + перезагрузки BentoBox buttons: catalog: name: Каталог дополнений @@ -1980,34 +1982,34 @@ management: name: Совместимость description: COMPATIBLE: |- - Запущена [name] [version]. + Запущена [name] [version]. BentoBox в настоящее время запущен на - СОВМЕСТИМОЙ версии серверного ПО + СОВМЕСТИМОЙ версии серверного ПО Его функции полностью разработаны для работы в этой среде. SUPPORTED: |- - Запущена [name] [version]. + Запущена [name] [version]. BentoBox в настоящее время запущен на - ПОДДЕРЖИВАЕМОЙ версии серверного ПО + ПОДДЕРЖИВАЕМОЙ версии серверного ПО Большинство функций работают как надо в этой среде NOT_SUPPORTED: |- - Запущена [name] [version]. + Запущена [name] [version]. BentoBox в настоящее время запущен на - НЕПОДДЕРЖИВАЕМОЙ версии серверного ПО + НЕПОДДЕРЖИВАЕМОЙ версии серверного ПО Хотя большинство функций все равно будут работать корректно, специфичные для версии баги или иные проблемы - вполне вероятны. + вполне вероятны. INCOMPATIBLE: |- - Запущена [name] [version]. + Запущена [name] [version]. BentoBox в настоящее время запущен на - НЕСОВМЕСТИМОЙ версии серверного ПО. + НЕСОВМЕСТИМОЙ версии серверного ПО. Может возникать странное поведение и ошибки, а большинство функций могут быть нестабильными. @@ -2021,12 +2023,12 @@ catalog: gamemodes: name: Игровые режимы description: |- - Нажмите для просмотра + Нажмите для просмотра доступных официальных игровых режимов. addons: name: Дополнения description: |- - Нажмите для просмотра + Нажмите для просмотра доступных официальных дополнений. icon: description-template: |- @@ -2035,18 +2037,18 @@ catalog: [description] - Нажмите для получения ссылки + Нажмите для получения ссылки на последний релиз. already-installed: Уже установлено! install-now: Установлено! - + empty-here: name: Кажется, здесь ничего нет... description: |- BentoBox не подключен к GitHub. - Позвольте BentoBox подключиться к GitHub в - конфигурации или попробуйте позднее. + Позвольте BentoBox подключиться к GitHub + в конфигурации или попробуйте позднее. enums: DamageCause: CONTACT: Контакт @@ -2094,8 +2096,8 @@ panel: BentoBox не смог найти участников для этого дополнения. - Позвольте BentoBox подключиться к GitHub в - конфигурации или попробуйте позднее. + Позвольте BentoBox подключиться к GitHub + в конфигурации или попробуйте позднее. # В этом разделе приведены значения для панелей BentoBox. panels: # Раздел переводов, используемых в панели дома. @@ -2157,8 +2159,9 @@ panels: hint: Нажмите для просмотра. # LEAF_FOLDER — заполнитель и папка; нажмите ЛКМ, чтобы переключить, нажмите ПКМ, чтобы открыть. leaf-folder: - hint: ЛКМ для переключения. · ПКМ для просмотра. - # СЕРИЯ — свернутый числовой ряд; [placeholder] содержит {N}, [count]/[min]/[max] = информация о диапазоне. + hint: ЛКМ для переключения. · ПКМ для + просмотра. + # SERIES — свернутый числовой ряд; [placeholder] содержит {N}, [count]/[min]/[max] = информация о диапазоне. series: name: [placeholder] description: [description] @@ -2170,7 +2173,8 @@ panels: sample-empty: #[index] → (пусто) # LEAF_SERIES — заполнитель и серия; нажмите ЛКМ, чтобы переключить отображение листа, нажмите ПКМ, чтобы переключить отображение всех. leaf-series: - hint: ЛКМ для переключения. · ПКМ для переключения всех. + hint: ЛКМ для переключения. · ПКМ для + переключения всех. # Текущее значение заполнителя для проигрывателя просмотра. value: [value] value-empty: (пусто) @@ -2182,14 +2186,15 @@ panels: # Кнопка, используемая в интерфейсах, которая позволяет вернуться на предыдущую страницу. previous: name: Предыдущая страница - description: Перейти на [number] страницу + description: Перейти на [number] страницу. # Кнопка, используемая в интерфейсах, которая позволяет перейти на следующую страницу. next: name: Следующая страница - description: Перейти на [number] страницу + description: Перейти на [number] страницу. tips: click-to-next: Нажмите, чтобы перейти на следующую страницу. - click-to-previous: Нажмите, чтобы перейти на предыдущую страницу. + click-to-previous: Нажмите, чтобы перейти на предыдущую + страницу. click-to-choose: Нажмите, чтобы выбрать. click-to-toggle: Нажмите, чтобы переключить. left-click-to-cycle-down: ЛКМ, чтобы прокрутить вниз. @@ -2197,9 +2202,9 @@ panels: successfully-loaded: |2 - ____ _ ____ - | _ \ | | | _ \ автор tastybento и Poslovitch + ____ _ ____ + | _ \ | | | _ \ автор tastybento и Poslovitch | |_) | ___ _ __ | |_ ___ | |_) | _____ __ 2017 - 2026 - | _ < / _ \ '_ \| __/ _ \| _ < / _ \ \/ / - | |_) | __/ | | | || (_) | |_) | (_) > < v[version] - |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Загружено за [time] мс. + | _ < / _ \ '_ \| __/ _ \| _ < / _ \ \/ / + | |_) | __/ | | | || (_) | |_) | (_) > < в[version] + |____/ \___|_| |_|\__\___/|____/ \___/_/\_\ Загружено за [time]мс. From cef0e605acad7e689cc7119bda33030fda9e1066 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:17:09 +0000 Subject: [PATCH 81/95] Add HIDE_ADDITIONAL_TOOLTIP ItemFlag to PanelItem to hide banner patterns, potion effects, etc. Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/5e0b4734-f396-4418-9b39-4f67a244dd21 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java | 2 ++ .../java/world/bentobox/bentobox/api/panels/PanelItemTest.java | 1 + 2 files changed, 3 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java b/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java index f43ce010f..e63946f0c 100644 --- a/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java +++ b/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java @@ -52,6 +52,7 @@ public PanelItem(PanelItemBuilder builtItem) { meta.addItemFlags(ItemFlag.HIDE_DESTROYS); meta.addItemFlags(ItemFlag.HIDE_PLACED_ON); meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + meta.addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP); icon.setItemMeta(meta); } @@ -227,6 +228,7 @@ public void setHead(ItemStack itemStack) { meta.addItemFlags(ItemFlag.HIDE_DESTROYS); meta.addItemFlags(ItemFlag.HIDE_PLACED_ON); meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + meta.addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP); if (originalMeta != null && originalMeta.hasCustomModelDataComponent()) { meta.setCustomModelDataComponent(originalMeta.getCustomModelDataComponent()); diff --git a/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java b/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java index 60945088d..2f16240df 100644 --- a/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java +++ b/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java @@ -212,6 +212,7 @@ void testSetHead() { verify(itemMeta).addItemFlags(ItemFlag.HIDE_DESTROYS); verify(itemMeta).addItemFlags(ItemFlag.HIDE_PLACED_ON); verify(itemMeta).addItemFlags(ItemFlag.HIDE_ENCHANTS); + verify(itemMeta).addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP); verify(ph, times(3)).setItemMeta(itemMeta); } From 060bec702d0abbb05701573356c2b483f3097c4e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:17:56 +0000 Subject: [PATCH 82/95] Initial plan From 43d32001b9cb42cf296711ac70e4314046a3d7f8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:34:22 +0000 Subject: [PATCH 83/95] Defer island saves while settings panel is open and apply click cooldown - Add beginDeferSaves()/endDeferSaves() to Island to batch flag changes into a single database save when the panel is closed - Move click cooldown check from TabbedPanel to PanelListenerManager so it runs before click handlers and panel refresh - TabbedPanel tracks refreshing state to distinguish true close from refresh close for deferred save handling - Add tests for defer save mechanism and timeout check Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/4f416153-32a9-45a2-bc46-568b590c8266 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../bentobox/api/panels/TabbedPanel.java | 36 +++++++++-- .../bentobox/database/objects/Island.java | 54 +++++++++++++++- .../listeners/PanelListenerManager.java | 8 +++ .../bentobox/database/objects/IslandTest.java | 60 ++++++++++++++++++ .../listeners/PanelListenerManagerTest.java | 61 +++++++++++++++++++ 5 files changed, 212 insertions(+), 7 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java b/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java index ea27bab33..6d905f39c 100644 --- a/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java +++ b/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java @@ -16,6 +16,7 @@ import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.TabbedPanelBuilder; import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; /** * Represents a panel with tabs. The top row of the panel is made up of up to 9 icons that are made of {@link world.bentobox.bentobox.api.panels.Tab}s. @@ -36,6 +37,15 @@ public class TabbedPanel extends Panel implements PanelListener { private int activeTab; private int activePage; private boolean closed; + /** + * True while the panel is being rebuilt during a refresh cycle. + * Used to distinguish refresh-triggered inventory close from a true close. + */ + private boolean refreshing; + /** + * True if this panel instance has started deferring island saves. + */ + private boolean deferringIslandSaves; /** * Construct the tabbed panel @@ -83,6 +93,14 @@ public void openPanel(int activeTab, int page) { // Request to open a non-existent tab throw new InvalidParameterException("Attempt to open a tab in a tabbed panel to a negative page! " + page); } + // Begin deferring island saves on first open to avoid database writes on every click + if (!deferringIslandSaves) { + Island island = getIsland(); + if (island != null) { + island.beginDeferSaves(); + deferringIslandSaves = true; + } + } this.activeTab = activeTab; this.activePage = page; // The items in the panel @@ -124,8 +142,11 @@ public void openPanel(int activeTab, int page) { } else { throw new InvalidParameterException("Unknown tab slot number " + activeTab); } - // Show it to the player + // Show it to the player — mark as refreshing so that the inventory close + // triggered by opening a new inventory is not treated as a true close. + this.refreshing = true; this.makePanel(tab.getName(), items, tpb.getSize(), tpb.getUser(), this); + this.refreshing = false; } /** @@ -167,14 +188,19 @@ public void setup() { public void onInventoryClose(InventoryCloseEvent event) { // This flag is set every time the inventory is closed or refreshed (closed and opened) closed = true; + // Only save when the panel is truly being closed, not during a refresh cycle + if (!refreshing && deferringIslandSaves) { + Island island = getIsland(); + if (island != null) { + island.endDeferSaves(); + } + deferringIslandSaves = false; + } } @Override public void onInventoryClick(User user, InventoryClickEvent event) { - if (plugin.onTimeout(user, this)) { - event.setCancelled(true); - return; - } + // Note: click cooldown is now applied in PanelListenerManager before handlers run. // Trap top row tab clicks if (event.isLeftClick() && tpb.getTabs().containsKey(event.getRawSlot()) && (tpb.getTabs().get(event.getRawSlot()).getPermission().isEmpty() diff --git a/src/main/java/world/bentobox/bentobox/database/objects/Island.java b/src/main/java/world/bentobox/bentobox/database/objects/Island.java index 66601649c..b48d672ef 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/Island.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/Island.java @@ -67,6 +67,14 @@ public class Island implements DataObject, MetaDataAble { */ private boolean changed; + /** + * Counter for deferred saves. When positive, {@link #setChanged()} will mark + * the island as dirty but will not trigger an immediate database save. + * This is used by the settings panel to batch all flag changes into a single + * save when the panel is closed. + */ + private transient int deferSaveCount = 0; + /** True if this island is deleted and pending deletion from the database * @deprecated */ @@ -1699,12 +1707,16 @@ public boolean isChanged() { } /** - * Indicates the fields have been changed. Used to optimize saving on shutdown and notify other servers + * Indicates the fields have been changed. Used to optimize saving on shutdown and notify other servers. + * If saves are currently deferred (via {@link #beginDeferSaves()}), the island is + * marked as dirty but no database write occurs until {@link #endDeferSaves()} is called. */ public void setChanged() { this.setUpdatedDate(System.currentTimeMillis()); this.changed = true; - IslandsManager.updateIsland(this); + if (deferSaveCount <= 0) { + IslandsManager.updateIsland(this); + } } /** @@ -1714,6 +1726,44 @@ public void clearChanged() { this.changed = false; } + /** + * Begin deferring database saves. While deferred, {@link #setChanged()} will + * mark the island as dirty but will not trigger an immediate database write. + * This is intended for batching multiple flag changes (e.g. from the settings + * panel) into a single save when {@link #endDeferSaves()} is called. + *

+ * Calls to this method must be balanced with calls to {@link #endDeferSaves()}. + * Multiple callers may defer simultaneously (reference-counted). + * + * @since 3.14.0 + */ + public void beginDeferSaves() { + deferSaveCount++; + } + + /** + * End deferring database saves. Decrements the defer counter; when it reaches + * zero the island is saved if it has been marked as changed. + * + * @since 3.14.0 + */ + public void endDeferSaves() { + if (deferSaveCount > 0) { + deferSaveCount--; + } + if (deferSaveCount == 0 && changed) { + IslandsManager.updateIsland(this); + } + } + + /** + * @return true if saves are currently being deferred + * @since 3.14.0 + */ + public boolean isDeferSaves() { + return deferSaveCount > 0; + } + /** * Get the center location of the protection zone. This can be anywhere within * the island space and can move. Unless explicitly set, it will return the same diff --git a/src/main/java/world/bentobox/bentobox/listeners/PanelListenerManager.java b/src/main/java/world/bentobox/bentobox/listeners/PanelListenerManager.java index 86f762fc1..d68efae21 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/PanelListenerManager.java +++ b/src/main/java/world/bentobox/bentobox/listeners/PanelListenerManager.java @@ -19,6 +19,7 @@ import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.TabbedPanel; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.util.Util; @@ -52,6 +53,13 @@ public void onInventoryClick(InventoryClickEvent event) { // Get the panel itself Panel panel = openPanels.get(user.getUniqueId()); + // Apply click cooldown for TabbedPanel before handlers run. + // This prevents rapid clicks from triggering expensive flag changes + // and panel rebuilds. + if (panel.getListener().filter(TabbedPanel.class::isInstance).isPresent() + && BentoBox.getInstance().onTimeout(user, panel)) { + return; + } // Check that they clicked on a specific item PanelItem pi = panel.getItems().get(event.getRawSlot()); if (pi != null) { diff --git a/src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java b/src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java index 9c89b2f2d..1482c53c0 100644 --- a/src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java +++ b/src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java @@ -706,6 +706,66 @@ void testSetChanged() { assertTrue(island.isChanged()); } + @Test + void testBeginDeferSaves() { + assertFalse(island.isDeferSaves()); + island.beginDeferSaves(); + assertTrue(island.isDeferSaves()); + } + + @Test + void testEndDeferSaves() { + island.beginDeferSaves(); + assertTrue(island.isDeferSaves()); + island.endDeferSaves(); + assertFalse(island.isDeferSaves()); + } + + @Test + void testSetChangedWhileDeferred() { + island.beginDeferSaves(); + island.clearChanged(); + // setChanged should mark as changed but not trigger save while deferred + island.setChanged(); + assertTrue(island.isChanged()); + assertTrue(island.isDeferSaves()); + } + + @Test + void testEndDeferSavesTriggersUpdateWhenChanged() { + island.beginDeferSaves(); + island.clearChanged(); + island.setChanged(); + assertTrue(island.isChanged()); + // End deferring - since changed is true, this will attempt to save + island.endDeferSaves(); + assertFalse(island.isDeferSaves()); + } + + @Test + void testNestedDeferSaves() { + // Multiple callers can defer simultaneously (reference-counted) + island.beginDeferSaves(); + island.beginDeferSaves(); + assertTrue(island.isDeferSaves()); + island.endDeferSaves(); + assertTrue(island.isDeferSaves()); // Still deferred (one remaining) + island.endDeferSaves(); + assertFalse(island.isDeferSaves()); // Now fully ended + } + + @Test + void testEndDeferSavesNeverGoesNegative() { + // Calling endDeferSaves without beginDeferSaves should not go negative + island.endDeferSaves(); + assertFalse(island.isDeferSaves()); + // Subsequent begin/end should still work + island.beginDeferSaves(); + assertTrue(island.isDeferSaves()); + island.endDeferSaves(); + assertFalse(island.isDeferSaves()); + } + @Test void testSetName() { island.setName("MyIsland"); diff --git a/src/test/java/world/bentobox/bentobox/listeners/PanelListenerManagerTest.java b/src/test/java/world/bentobox/bentobox/listeners/PanelListenerManagerTest.java index 639c08399..668eb1e80 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/PanelListenerManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/PanelListenerManagerTest.java @@ -42,6 +42,7 @@ import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem.ClickHandler; import world.bentobox.bentobox.api.panels.PanelListener; +import world.bentobox.bentobox.api.panels.TabbedPanel; import world.bentobox.bentobox.api.user.User; /** @@ -393,4 +394,64 @@ void testGetOpenPanels() { assertSame(panel, PanelListenerManager.getOpenPanels().get(uuid)); } + /** + * Test that clicks are blocked when TabbedPanel listener is on timeout + */ + @Test + void testOnInventoryClickTabbedPanelTimeout() { + // Set up panel with a TabbedPanel listener + TabbedPanel tabbedPanel = mock(TabbedPanel.class); + when(panel.getListener()).thenReturn(Optional.of(tabbedPanel)); + PanelListenerManager.getOpenPanels().put(uuid, panel); + + // Mock BentoBox.onTimeout to return true (on timeout) + when(plugin.onTimeout(any(User.class), eq(panel))).thenReturn(true); + + InventoryClickEvent e = new InventoryClickEvent(view, type, 0, click, inv); + plm.onInventoryClick(e); + + // Click handler and panel listener should NOT be called when on timeout + verify(ch, never()).onClick(any(), any(), any(), eq(0)); + verify(tabbedPanel, never()).onInventoryClick(any(), any()); + } + + /** + * Test that clicks proceed when TabbedPanel listener is not on timeout + */ + @Test + void testOnInventoryClickTabbedPanelNoTimeout() { + // Set up panel with a TabbedPanel listener + TabbedPanel tabbedPanel = mock(TabbedPanel.class); + when(panel.getListener()).thenReturn(Optional.of(tabbedPanel)); + PanelListenerManager.getOpenPanels().put(uuid, panel); + + // Mock BentoBox.onTimeout to return false (no timeout) + when(plugin.onTimeout(any(User.class), eq(panel))).thenReturn(false); + + InventoryClickEvent e = new InventoryClickEvent(view, type, 0, click, inv); + plm.onInventoryClick(e); + + // Click handler and panel listener should be called + verify(ch).onClick(eq(panel), any(User.class), eq(click), eq(0)); + verify(tabbedPanel).onInventoryClick(any(), any()); + } + + /** + * Test that non-TabbedPanel listeners don't get timeout checks + */ + @Test + void testOnInventoryClickNonTabbedPanelNoTimeoutCheck() { + // Regular panel listener (not TabbedPanel) + PanelListenerManager.getOpenPanels().put(uuid, panel); + + InventoryClickEvent e = new InventoryClickEvent(view, type, 0, click, inv); + plm.onInventoryClick(e); + + // Click handler should be called regardless of timeout + verify(ch).onClick(eq(panel), any(User.class), eq(click), eq(0)); + verify(pl).onInventoryClick(any(), any()); + // onTimeout should NOT be called for non-TabbedPanel + verify(plugin, never()).onTimeout(any(User.class), any(Panel.class)); + } + } From 532e21523418f702cba95d1220a79425c5e5b849 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 7 Apr 2026 18:30:08 -0700 Subject: [PATCH 84/95] Fix #2919: extra blank line in confirmation conversation prompts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Conversation prompts were sending their text via User.sendRawMessage and returning "" from getPromptText, which caused Bukkit's Conversation API to print an empty line after the actual prompt. Return the legacy-coded translation directly instead — Paper renders § codes correctly through sendRawMessage, so the original workaround is no longer needed. Reverts the prompt-rendering portion of 515a7f1e0 across all 9 prompt classes (ConfirmPrompt, admin/blueprint NamePrompt, InviteNamePrompt, Commands/Description/Name(Success)Prompt) and restores the matching test assertions. Co-Authored-By: Claude Opus 4.6 --- .../api/commands/admin/conversations/NamePrompt.java | 5 +---- .../api/commands/island/conversations/ConfirmPrompt.java | 5 +---- .../api/commands/island/team/IslandTeamInviteGUI.java | 3 +-- .../bentobox/blueprints/conversation/CommandsPrompt.java | 8 ++------ .../blueprints/conversation/CommandsSuccessPrompt.java | 7 ++----- .../blueprints/conversation/DescriptionPrompt.java | 7 ++----- .../blueprints/conversation/DescriptionSuccessPrompt.java | 7 ++----- .../bentobox/blueprints/conversation/NamePrompt.java | 3 +-- .../blueprints/conversation/NameSuccessPrompt.java | 4 +--- .../api/commands/island/team/IslandTeamInviteGUITest.java | 3 +-- .../blueprints/conversation/CommandsPromptTest.java | 5 +++-- 11 files changed, 17 insertions(+), 40 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java index b0d746782..79776ed5b 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java @@ -34,10 +34,7 @@ public NamePrompt(BentoBox plugin, @NonNull Island island, @NonNull User user, S @Override @NonNull public String getPromptText(@NonNull ConversationContext context) { - // Send via User to properly render MiniMessage/legacy formatting, - // since Bukkit's conversation API sends raw text without formatting. - user.sendRawMessage(user.getTranslation("commands.island.renamehome.enter-new-name")); - return ""; + return user.getTranslation("commands.island.renamehome.enter-new-name"); } @Override diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/conversations/ConfirmPrompt.java b/src/main/java/world/bentobox/bentobox/api/commands/island/conversations/ConfirmPrompt.java index ca7ce68c0..d9ac5d5f0 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/conversations/ConfirmPrompt.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/conversations/ConfirmPrompt.java @@ -35,10 +35,7 @@ public ConfirmPrompt(@NonNull User user, BentoBox plugin, String instructions, S @Override @NonNull public String getPromptText(@NonNull ConversationContext context) { - // Send via User to properly render MiniMessage/legacy formatting, - // since Bukkit's conversation API sends raw text without formatting. - user.sendRawMessage(user.getTranslation(instructions)); - return ""; + return user.getTranslation(instructions); } @Override diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java index c4265a78f..9da2881a0 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java @@ -267,8 +267,7 @@ class InviteNamePrompt extends StringPrompt { @Override @NonNull public String getPromptText(@NonNull ConversationContext context) { - user.sendRawMessage(user.getTranslation("commands.island.team.invite.gui.enter-name")); - return ""; + return user.getTranslation("commands.island.team.invite.gui.enter-name"); } @Override diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsPrompt.java index 6f61b422a..3f18e4d95 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsPrompt.java @@ -44,14 +44,10 @@ public CommandsPrompt(GameModeAddon addon, BlueprintBundle bb) { sb.append(line); sb.append(System.lineSeparator()); } - // Send formatted message directly since Bukkit conversations don't parse MiniMessage - user.sendRawMessage(sb.toString()); - return ""; + return sb.toString(); } - String msg = user.getTranslation("commands.admin.blueprint.management.commands.instructions", + return user.getTranslation("commands.admin.blueprint.management.commands.instructions", TextVariables.NAME, bb.getDisplayName()); - user.sendRawMessage(msg); - return ""; } @SuppressWarnings("unchecked") diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsSuccessPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsSuccessPrompt.java index 9d741a676..df86c76d8 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsSuccessPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/CommandsSuccessPrompt.java @@ -38,18 +38,15 @@ public CommandsSuccessPrompt(GameModeAddon addon, BlueprintBundle bb) { User user = User.getInstance((Player) context.getForWhom()); @SuppressWarnings("unchecked") List commands = (List) context.getSessionData("commands"); - String msg; if (commands != null) { bb.setCommands(commands); BentoBox.getInstance().getBlueprintsManager().addBlueprintBundle(addon, bb); BentoBox.getInstance().getBlueprintsManager().saveBlueprintBundle(addon, bb); new BlueprintManagementPanel(BentoBox.getInstance(), user, addon).openBB(bb); - msg = user.getTranslation("commands.admin.blueprint.management.commands.success"); + return user.getTranslation("commands.admin.blueprint.management.commands.success"); } else { - msg = user.getTranslation("commands.admin.blueprint.management.commands.cancelling"); + return user.getTranslation("commands.admin.blueprint.management.commands.cancelling"); } - user.sendRawMessage(msg); - return ""; } @Override diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java index ef82e5864..76b9a5820 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java @@ -43,12 +43,9 @@ public DescriptionPrompt(GameModeAddon addon, BlueprintBundle bb) { sb.append(line); sb.append(System.lineSeparator()); } - user.sendRawMessage(sb.toString()); - return ""; + return sb.toString(); } - String msg = user.getTranslation("commands.admin.blueprint.management.description.instructions", TextVariables.NAME, bb.getDisplayName()); - user.sendRawMessage(msg); - return ""; + return user.getTranslation("commands.admin.blueprint.management.description.instructions", TextVariables.NAME, bb.getDisplayName()); } @SuppressWarnings("unchecked") diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java index acd40e906..6865700be 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java @@ -33,18 +33,15 @@ public DescriptionSuccessPrompt(GameModeAddon addon, BlueprintBundle bb) { User user = User.getInstance((Player)context.getForWhom()); @SuppressWarnings("unchecked") List description = (List)context.getSessionData("description"); - String msg; if (description != null) { bb.setDescription(description); BentoBox.getInstance().getBlueprintsManager().addBlueprintBundle(addon, bb); BentoBox.getInstance().getBlueprintsManager().saveBlueprintBundle(addon, bb); new BlueprintManagementPanel(BentoBox.getInstance(), user, addon).openBB(bb); - msg = user.getTranslation("commands.admin.blueprint.management.description.success"); + return user.getTranslation("commands.admin.blueprint.management.description.success"); } else { - msg = user.getTranslation("commands.admin.blueprint.management.description.cancelling"); + return user.getTranslation("commands.admin.blueprint.management.description.cancelling"); } - user.sendRawMessage(msg); - return ""; } @Override diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java index 95f422b64..58b2bda70 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java @@ -45,8 +45,7 @@ public NamePrompt(@NonNull GameModeAddon addon, @Nullable Blueprint bp, @Nullabl public @NonNull String getPromptText(ConversationContext context) { User user = User.getInstance((Player) context.getForWhom()); - user.sendRawMessage(user.getTranslation("commands.admin.blueprint.management.name.prompt")); - return ""; + return user.getTranslation("commands.admin.blueprint.management.name.prompt"); } diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java index d62b9cc31..09ff0fa08 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java @@ -77,9 +77,7 @@ public NameSuccessPrompt(@NonNull GameModeAddon addon, @Nullable BlueprintBundle // Set the name } - String msg = user.getTranslation("commands.admin.blueprint.management.description.success"); - user.sendRawMessage(msg); - return ""; + return user.getTranslation("commands.admin.blueprint.management.description.success"); } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUITest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUITest.java index e6f899d67..588b3509b 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUITest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUITest.java @@ -429,8 +429,7 @@ void testInviteNamePrompt_getPromptText_returnsTranslation() { IslandTeamInviteGUI.InviteNamePrompt prompt = gui.new InviteNamePrompt(); ConversationContext ctx = mock(ConversationContext.class); - // getPromptText sends via User.sendRawMessage and returns empty string - assertEquals("", prompt.getPromptText(ctx)); + assertEquals("commands.island.team.invite.gui.enter-name", prompt.getPromptText(ctx)); } @Test diff --git a/src/test/java/world/bentobox/bentobox/blueprints/conversation/CommandsPromptTest.java b/src/test/java/world/bentobox/bentobox/blueprints/conversation/CommandsPromptTest.java index b2adc73ff..62a9a0264 100644 --- a/src/test/java/world/bentobox/bentobox/blueprints/conversation/CommandsPromptTest.java +++ b/src/test/java/world/bentobox/bentobox/blueprints/conversation/CommandsPromptTest.java @@ -63,8 +63,9 @@ void testGetPromptTextFirstCall() { void testGetPromptTextWithSessionData() { when(context.getSessionData("commands")).thenReturn(List.of("say hello")); String text = prompt.getPromptText(context); - // getPromptText sends via User.sendRawMessage and returns empty string - assertEquals("", text); + assertInstanceOf(String.class, text); + // Should contain the command text in the output + assertEquals(true, text.contains("say hello")); } @Test From 7c0e6a96b5282a6a3bea0bbdd88d5bf3659aab46 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 01:45:10 +0000 Subject: [PATCH 85/95] Replace deprecated HIDE_ADDITIONAL_TOOLTIP with modern TooltipDisplay data component API Agent-Logs-Url: https://github.com/BentoBoxWorld/BentoBox/sessions/d1d186bf-e269-47b1-bebc-d16b151d1ffc Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../bentobox/api/panels/PanelItem.java | 47 ++++++++++++++++++- .../bentobox/api/panels/PanelItemTest.java | 7 ++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java b/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java index e63946f0c..8afe5a7b8 100644 --- a/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java +++ b/src/main/java/world/bentobox/bentobox/api/panels/PanelItem.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Optional; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.TooltipDisplay; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; @@ -52,7 +54,6 @@ public PanelItem(PanelItemBuilder builtItem) { meta.addItemFlags(ItemFlag.HIDE_DESTROYS); meta.addItemFlags(ItemFlag.HIDE_PLACED_ON); meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - meta.addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP); icon.setItemMeta(meta); } @@ -64,6 +65,12 @@ public PanelItem(PanelItemBuilder builtItem) { setGlow(builtItem.isGlow()); setInvisible(builtItem.isInvisible()); + // Hide additional item-specific tooltip info (banner patterns, potion effects, etc.) + hideAdditionalTooltip(); + // Refresh meta to reflect current item state including tooltip display changes + if (meta != null) { + meta = icon.getItemMeta(); + } } /** @@ -228,7 +235,6 @@ public void setHead(ItemStack itemStack) { meta.addItemFlags(ItemFlag.HIDE_DESTROYS); meta.addItemFlags(ItemFlag.HIDE_PLACED_ON); meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - meta.addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP); if (originalMeta != null && originalMeta.hasCustomModelDataComponent()) { meta.setCustomModelDataComponent(originalMeta.getCustomModelDataComponent()); @@ -240,5 +246,42 @@ public void setHead(ItemStack itemStack) { setName(name); setDescription(description); setGlow(glow); + // Hide additional item-specific tooltip info (banner patterns, potion effects, etc.) + hideAdditionalTooltip(); + // Refresh meta to reflect current item state including tooltip display changes + if (meta != null) { + meta = icon.getItemMeta(); + } + } + + /** + * Hides additional item-specific tooltip information such as banner patterns, potion effects, + * firework effects, and other item metadata using the modern {@link TooltipDisplay} data component API. + * Merges with any existing tooltip display settings (e.g., from ItemFlags) to avoid overwriting them. + */ + private void hideAdditionalTooltip() { + if (icon.getType().isAir()) { + return; + } + // Read existing tooltip display to preserve any ItemFlag-based hiding + TooltipDisplay existing = icon.getData(DataComponentTypes.TOOLTIP_DISPLAY); + TooltipDisplay.Builder builder = TooltipDisplay.tooltipDisplay(); + if (existing != null) { + builder.hideTooltip(existing.hideTooltip()); + builder.addHiddenComponents( + existing.hiddenComponents().toArray(io.papermc.paper.datacomponent.DataComponentType[]::new)); + } + // Hide additional components that don't have non-deprecated ItemFlag equivalents + builder.addHiddenComponents( + DataComponentTypes.BANNER_PATTERNS, + DataComponentTypes.POTION_CONTENTS, + DataComponentTypes.FIREWORKS, + DataComponentTypes.FIREWORK_EXPLOSION, + DataComponentTypes.JUKEBOX_PLAYABLE, + DataComponentTypes.SUSPICIOUS_STEW_EFFECTS, + DataComponentTypes.BUNDLE_CONTENTS, + DataComponentTypes.MAP_DECORATIONS + ); + icon.setData(DataComponentTypes.TOOLTIP_DISPLAY, builder.build()); } } diff --git a/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java b/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java index 2f16240df..3551eeb30 100644 --- a/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java +++ b/src/test/java/world/bentobox/bentobox/api/panels/PanelItemTest.java @@ -4,6 +4,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -12,6 +14,8 @@ import java.util.List; import java.util.Optional; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.TooltipDisplay; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; @@ -212,8 +216,9 @@ void testSetHead() { verify(itemMeta).addItemFlags(ItemFlag.HIDE_DESTROYS); verify(itemMeta).addItemFlags(ItemFlag.HIDE_PLACED_ON); verify(itemMeta).addItemFlags(ItemFlag.HIDE_ENCHANTS); - verify(itemMeta).addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP); verify(ph, times(3)).setItemMeta(itemMeta); + // Verify TooltipDisplay is applied for additional tooltip hiding + verify(ph).setData(eq(DataComponentTypes.TOOLTIP_DISPLAY), any(TooltipDisplay.class)); } /** From db2758704e88acc6649f7e538cb264f677486738 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 7 Apr 2026 19:50:28 -0700 Subject: [PATCH 86/95] Skip locale files with invalid BCP-47 tags Filenames like `zh_CN.yml` (underscore instead of dash) parse to `Locale.ROOT` via `Locale.forLanguageTag`, which has an empty language and empty display name. When such a file ships in any addon's locales folder, `reloadLanguages()` adds the ROOT entry to the shared languages map, causing a blank slot to appear in the language selector panel next to US English. Skip these files in `loadLocalesFromFile` and log a warning naming the offending file so addon authors can fix the tag. Co-Authored-By: Claude Opus 4.6 --- .../bentobox/bentobox/managers/LocalesManager.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/bentobox/managers/LocalesManager.java b/src/main/java/world/bentobox/bentobox/managers/LocalesManager.java index d6abab74a..02b89b010 100644 --- a/src/main/java/world/bentobox/bentobox/managers/LocalesManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/LocalesManager.java @@ -269,7 +269,17 @@ public void loadLocalesFromFile(String localeFolder) { } // Run through the files and store the locales for (File language : Objects.requireNonNull(localeDir.listFiles(ymlFilter))) { - Locale localeObject = Locale.forLanguageTag(language.getName().substring(0, language.getName().length() - 4)); + String tag = language.getName().substring(0, language.getName().length() - 4); + Locale localeObject = Locale.forLanguageTag(tag); + + // Skip files whose name does not parse to a real BCP-47 language tag. + // e.g. "zh_CN.yml" (underscore) yields Locale.ROOT, which would otherwise show + // up as a blank entry in the language selector panel. + if (localeObject.getLanguage().isEmpty()) { + plugin.logWarning("Ignoring locale file '" + localeFolder + "/" + language.getName() + + "': '" + tag + "' is not a valid BCP-47 language tag (use '-' not '_')."); + continue; + } try { YamlConfiguration languageYaml = YamlConfiguration.loadConfiguration(language); From 5266c6cb5bd8065cac5ed9daa4ccffef71762981 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 7 Apr 2026 20:05:56 -0700 Subject: [PATCH 87/95] Update src/main/java/world/bentobox/bentobox/Settings.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/main/java/world/bentobox/bentobox/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/bentobox/Settings.java b/src/main/java/world/bentobox/bentobox/Settings.java index 615a3c3f9..f8ab1d85b 100644 --- a/src/main/java/world/bentobox/bentobox/Settings.java +++ b/src/main/java/world/bentobox/bentobox/Settings.java @@ -348,7 +348,7 @@ public class Settings implements ConfigObject { @ConfigComment("") @ConfigComment("Enable or disable chunk pre-generation.") @ConfigEntry(path = "island.pregeneration.enabled", since = "3.14.0") - private boolean pregenEnabled = true; + private boolean pregenEnabled = false; @ConfigComment("Number of future islands to pre-generate chunks for, per game mode world.") @ConfigComment("Higher values use more disk space but reduce the chance of lag on island creation.") From 2182fdcd3e733b9a93f1556fcdb4112a2f1fc723 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 7 Apr 2026 20:25:06 -0700 Subject: [PATCH 88/95] Update obsidian scooping lava tip duration version and enhance component content extraction --- .../world/bentobox/bentobox/Settings.java | 4 +- .../world/bentobox/bentobox/util/Util.java | 42 ++++++++++++++++++- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/Settings.java b/src/main/java/world/bentobox/bentobox/Settings.java index 615a3c3f9..10be672ba 100644 --- a/src/main/java/world/bentobox/bentobox/Settings.java +++ b/src/main/java/world/bentobox/bentobox/Settings.java @@ -1255,7 +1255,7 @@ public void setObsidianScoopingCooldown(int obsidianScoopingCooldown) { * newly formed obsidian blocks that can be scooped. * * @return the lava tip duration in seconds; 0 or less means disabled - * @since 3.12.0 + * @since 3.14.0 */ public int getObsidianScoopingLavaTipDuration() { return obsidianScoopingLavaTipDuration; @@ -1266,7 +1266,7 @@ public int getObsidianScoopingLavaTipDuration() { * newly formed obsidian blocks that can be scooped. * * @param obsidianScoopingLavaTipDuration the duration in seconds; 0 or less disables - * @since 3.12.0 + * @since 3.14.0 */ public void setObsidianScoopingLavaTipDuration(int obsidianScoopingLavaTipDuration) { this.obsidianScoopingLavaTipDuration = obsidianScoopingLavaTipDuration; diff --git a/src/main/java/world/bentobox/bentobox/util/Util.java b/src/main/java/world/bentobox/bentobox/util/Util.java index 9ada6ce19..95e0bd0fd 100644 --- a/src/main/java/world/bentobox/bentobox/util/Util.java +++ b/src/main/java/world/bentobox/bentobox/util/Util.java @@ -50,6 +50,9 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.KeybindComponent; +import net.kyori.adventure.text.ScoreComponent; +import net.kyori.adventure.text.TranslatableComponent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; @@ -1361,15 +1364,50 @@ private static void appendComponentLegacy(StringBuilder sb, Component component, // merge() with default strategy lets the child component override inherited fields, // and inherits the parent's fields where the child leaves them unset. Style effective = inherited.merge(component.style()); - if (component instanceof TextComponent text && !text.content().isEmpty()) { + String content = getComponentContent(component); + if (!content.isEmpty()) { emitStyleTransition(sb, effective, state); - sb.append(text.content()); + sb.append(content); } for (Component child : component.children()) { appendComponentLegacy(sb, child, effective, state); } } + /** + * Extracts the direct text content from a Component node without recursing into children. + * Used by {@link #appendComponentLegacy} so that non-TextComponent types degrade gracefully + * when serializing to legacy format (e.g. for offline message delivery). + *

    + *
  • {@link TextComponent} — returns the literal text content.
  • + *
  • {@link TranslatableComponent} — returns the {@code fallback()} text if set, + * otherwise the translation key (e.g. {@code "item.minecraft.diamond_sword"}). + * The key is at least recognisable; the client-side translation cannot be resolved + * server-side.
  • + *
  • {@link KeybindComponent} — returns the keybind id (e.g. {@code "key.jump"}). + * The actual bound key is only known to the client.
  • + *
  • {@link ScoreComponent} — returns the objective name; the live score value is + * client-side only.
  • + *
  • All other types — returns an empty string (no useful text to extract).
  • + *
+ */ + private static String getComponentContent(Component component) { + if (component instanceof TextComponent text) { + return text.content(); + } else if (component instanceof TranslatableComponent translatable) { + // Prefer the server-side fallback string if the addon/code set one; + // otherwise fall back to the raw key — still recognisable (e.g. "item.minecraft.diamond"). + String fallback = translatable.fallback(); + return (fallback != null && !fallback.isEmpty()) ? fallback : translatable.key(); + } else if (component instanceof KeybindComponent keybind) { + return keybind.keybind(); + } else if (component instanceof ScoreComponent score) { + return score.objective(); + } + // SelectorComponent, NBT components — no server-resolvable text. + return ""; + } + private static void emitStyleTransition(StringBuilder sb, Style style, EmittedState state) { boolean wantBold = style.decoration(TextDecoration.BOLD) == TextDecoration.State.TRUE; boolean wantItalic = style.decoration(TextDecoration.ITALIC) == TextDecoration.State.TRUE; From 570498e9a7e3352127000c2f506b79d347aa1125 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 7 Apr 2026 20:34:19 -0700 Subject: [PATCH 89/95] Fix ChunkPregenManagerTest after pregenEnabled default flipped to false The four tests that exercise the enabled path relied on the old default of true. Explicitly enable pregen in each so they no longer depend on the Settings default. Co-Authored-By: Claude Opus 4.6 --- .../bentobox/bentobox/managers/ChunkPregenManagerTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java index a92d0d113..36f2d6fd1 100644 --- a/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/ChunkPregenManagerTest.java @@ -147,6 +147,7 @@ void testOnBentoBoxReady_pregenDisabled() { @Test void testOnBentoBoxReady_pregenEnabled() { + settings.setPregenEnabled(true); manager.onServerLoad(serverLoadEvent); manager.onBentoBoxReady(readyEvent); verify(sch).runTaskTimer(eq(plugin), any(Runnable.class), anyLong(), anyLong()); @@ -154,6 +155,7 @@ void testOnBentoBoxReady_pregenEnabled() { @Test void testOnBentoBoxReady_deferredUntilServerLoaded() { + settings.setPregenEnabled(true); // Ready event alone should NOT schedule anything — the server hasn't loaded yet manager.onBentoBoxReady(readyEvent); verify(sch, never()).runTaskTimer(any(), any(Runnable.class), anyLong(), anyLong()); @@ -185,6 +187,7 @@ void testOnIslandCreated_pregenDisabled() { @Test void testOnIslandCreated_pregenEnabled() { + settings.setPregenEnabled(true); when(createdEvent.getIsland()).thenReturn(island); when(island.getWorld()).thenReturn(world); manager.onIslandCreated(createdEvent); @@ -206,6 +209,7 @@ void testOnIslandResetted_pregenDisabled() { @Test void testOnIslandResetted_pregenEnabled() { + settings.setPregenEnabled(true); when(resettedEvent.getIsland()).thenReturn(island); when(island.getWorld()).thenReturn(world); manager.onIslandResetted(resettedEvent); From a44b6055c7a681c04f1b4a533b42f985fe8c15e3 Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 8 Apr 2026 04:53:23 -0700 Subject: [PATCH 90/95] Add callback support for spawned MythicMobs in MythicMobsHook --- .../bentobox/hooks/MythicMobsHook.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java b/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java index 616ea0622..40273c9ac 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java +++ b/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java @@ -1,5 +1,7 @@ package world.bentobox.bentobox.hooks; +import java.util.function.Consumer; + import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -55,17 +57,42 @@ public String getFailureCause() { * @return true if spawn is successful */ public boolean spawnMythicMob(MythicMobRecord mmr, Location spawnLocation) { + return spawnMythicMob(mmr, spawnLocation, null); + } + + /** + * Spawn a MythicMob and run a callback once the entity has actually been spawned. + *

+ * Spawning is delayed by 40 ticks inside this hook (to give NMS-pasted blocks time + * to settle), which means the caller cannot act on the spawned entity synchronously. + * This overload accepts a {@link Consumer} that will be invoked with the live Bukkit + * {@link Entity} once the mob has been spawned, so that addons (e.g. AOneBlock) can + * perform follow-up work such as clearing space for large hitboxes. + * + * @param mmr MythicMobRecord + * @param spawnLocation location + * @param onSpawn callback invoked with the spawned Bukkit entity; may be {@code null} + * @return true if the mob type exists and a spawn was scheduled + * @since 3.14.0 + */ + public boolean spawnMythicMob(MythicMobRecord mmr, Location spawnLocation, Consumer onSpawn) { if (!this.isPluginAvailable()) { return false; } return MythicBukkit.inst().getMobManager().getMythicMob(mmr.type()).map(mob -> { // A delay is required before spawning, I assume because the blocks are pasted using NMS Bukkit.getScheduler().runTaskLater(getPlugin(), () -> { - // spawns mob + // spawns mob ActiveMob activeMob = mob.spawn(BukkitAdapter.adapt(spawnLocation), mmr.level()); activeMob.setDisplayName(mmr.displayName()); activeMob.setPower(mmr.power()); activeMob.setStance(mmr.stance()); + if (onSpawn != null) { + Entity bukkitEntity = activeMob.getEntity().getBukkitEntity(); + if (bukkitEntity != null) { + onSpawn.accept(bukkitEntity); + } + } }, 40L); return true; }).orElse(false); From e24ddee666ac20e0b6e157dc0d5951e33410ce4e Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 8 Apr 2026 13:13:33 -0700 Subject: [PATCH 91/95] Make MythicMobsHook.spawnMythicMob delay configurable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing spawnMythicMob overloads hard-coded a 40-tick (2-second) delay before the actual spawn — added for blueprint-paste callers so NMS-pasted blocks settle before mobs land on them. Synchronous callers (e.g. AOneBlock's MythicMobCustomBlock) that replace a single block via the Bukkit API have nothing to wait for, so that delay is pure dead time in their path. Add a 4-arg spawnMythicMob(record, location, Consumer, long) overload that takes an explicit delayTicks parameter. delayTicks <= 0 runs the spawn inline on the current tick; positive values still go through runTaskLater. The existing 3-arg overload now delegates with 40L so blueprint-paste behaviour is unchanged, and the 2-arg overload keeps its existing chain. This lets AOneBlock bosses appear on the same tick as the magic-block break without affecting any other caller. Co-Authored-By: Claude Opus 4.6 --- .../bentobox/hooks/MythicMobsHook.java | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java b/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java index 40273c9ac..0cff041d7 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java +++ b/src/main/java/world/bentobox/bentobox/hooks/MythicMobsHook.java @@ -63,11 +63,9 @@ public boolean spawnMythicMob(MythicMobRecord mmr, Location spawnLocation) { /** * Spawn a MythicMob and run a callback once the entity has actually been spawned. *

- * Spawning is delayed by 40 ticks inside this hook (to give NMS-pasted blocks time - * to settle), which means the caller cannot act on the spawned entity synchronously. - * This overload accepts a {@link Consumer} that will be invoked with the live Bukkit - * {@link Entity} once the mob has been spawned, so that addons (e.g. AOneBlock) can - * perform follow-up work such as clearing space for large hitboxes. + * Delegates to {@link #spawnMythicMob(MythicMobRecord, Location, Consumer, long)} + * with a 40-tick delay — the historical behaviour, required by blueprint-paste + * callers so blocks settle before mobs land on them. * * @param mmr MythicMobRecord * @param spawnLocation location @@ -76,13 +74,32 @@ public boolean spawnMythicMob(MythicMobRecord mmr, Location spawnLocation) { * @since 3.14.0 */ public boolean spawnMythicMob(MythicMobRecord mmr, Location spawnLocation, Consumer onSpawn) { + return spawnMythicMob(mmr, spawnLocation, onSpawn, 40L); + } + + /** + * Spawn a MythicMob with an explicit scheduler delay. + *

+ * Blueprint-paste callers need a short delay so NMS-pasted blocks settle + * before mobs land on them; synchronous callers (e.g. AOneBlock's + * {@code MythicMobCustomBlock}) can pass {@code 0} to spawn immediately on + * the current tick. When {@code delayTicks <= 0} the spawn runs inline and + * the {@code onSpawn} callback is invoked synchronously. + * + * @param mmr MythicMobRecord + * @param spawnLocation location + * @param onSpawn callback invoked with the spawned Bukkit entity; may be {@code null} + * @param delayTicks ticks to wait before spawning; {@code <= 0} = spawn immediately + * @return true if the mob type exists and a spawn was scheduled (or ran) + * @since 3.15.0 + */ + public boolean spawnMythicMob(MythicMobRecord mmr, Location spawnLocation, + Consumer onSpawn, long delayTicks) { if (!this.isPluginAvailable()) { return false; } return MythicBukkit.inst().getMobManager().getMythicMob(mmr.type()).map(mob -> { - // A delay is required before spawning, I assume because the blocks are pasted using NMS - Bukkit.getScheduler().runTaskLater(getPlugin(), () -> { - // spawns mob + Runnable spawn = () -> { ActiveMob activeMob = mob.spawn(BukkitAdapter.adapt(spawnLocation), mmr.level()); activeMob.setDisplayName(mmr.displayName()); activeMob.setPower(mmr.power()); @@ -93,7 +110,12 @@ public boolean spawnMythicMob(MythicMobRecord mmr, Location spawnLocation, Consu onSpawn.accept(bukkitEntity); } } - }, 40L); + }; + if (delayTicks <= 0L) { + spawn.run(); + } else { + Bukkit.getScheduler().runTaskLater(getPlugin(), spawn, delayTicks); + } return true; }).orElse(false); } From c2a48c2427bacde737cef8916f70d7ebf81a419e Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 8 Apr 2026 19:37:08 -0700 Subject: [PATCH 92/95] Preserve addon-owned placeholders across /bbox reload (#2930) The reload command was wiping every registered placeholder via PlaceholderAPIHook.unregisterAll(), but only re-registered the gamemode-default ones afterwards. Addons are not actually disabled by reload, so addon-registered placeholders (e.g. %level_..._island_level% from the Level addon) were left as orphaned, empty entries inside cached AddonPlaceholderExpansion instances and silently stopped resolving. Narrow PlaceholderAPIHook.unregisterAll() to only clear the BentoBox core expansion, add a targeted unregisterAll(Addon) overload, and have BentoBoxReloadCommand clear only the gamemode addons it knows how to rebuild. Co-Authored-By: Claude Opus 4.6 --- .../commands/BentoBoxReloadCommand.java | 11 ++++++--- .../placeholders/PlaceholderAPIHook.java | 23 +++++++++++++++++-- .../managers/PlaceholdersManager.java | 12 +++++++++- .../managers/PlaceholdersManagerTest.java | 15 ++++++++++++ 4 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java b/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java index 1c6c1135d..743794d20 100644 --- a/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java +++ b/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java @@ -8,6 +8,7 @@ import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.commands.reload.BentoBoxReloadLocalesCommand; import world.bentobox.bentobox.listeners.PanelListenerManager; +import world.bentobox.bentobox.managers.PlaceholdersManager; /** * Reloads settings, addons and localization. @@ -38,8 +39,12 @@ public boolean execute(User user, String label, List args) { if (args.isEmpty()) { this.askConfirmation(user, user.getTranslation("commands.bentobox.reload.warning"), () -> { - // Unregister all placeholders - getPlugin().getPlaceholdersManager().unregisterAll(); + // Clear placeholders that this reload will rebuild. Addon-owned + // placeholders (e.g. from the Level addon) are intentionally + // preserved because reload does not re-invoke addons (#2930). + PlaceholdersManager pm = getPlugin().getPlaceholdersManager(); + pm.unregisterAll(); + getPlugin().getAddonsManager().getGameModeAddons().forEach(pm::unregisterAll); // Close all open panels PanelListenerManager.closeAllPanels(); @@ -55,7 +60,7 @@ public boolean execute(User user, String label, List args) { user.sendMessage("commands.bentobox.reload.locales-reloaded"); // Register new default gamemode placeholders - getPlugin().getAddonsManager().getGameModeAddons().forEach(getPlugin().getPlaceholdersManager()::registerDefaultPlaceholders); + getPlugin().getAddonsManager().getGameModeAddons().forEach(pm::registerDefaultPlaceholders); }); } else { diff --git a/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java b/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java index 9e5205bf9..4886e672d 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java +++ b/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java @@ -285,11 +285,30 @@ protected void setBentoboxExpansion(BentoBoxPlaceholderExpansion bentoboxExpansi /** * {@inheritDoc} + *

+ * Only clears the BentoBox-core expansion. Placeholders registered by addons + * via {@link #registerPlaceholder(Addon, String, PlaceholderReplacer)} are + * intentionally preserved, because callers like {@code /bbox reload} do not + * re-invoke addons and would otherwise leave addon placeholders in a stale, + * empty state (see #2930). To clear a specific addon's placeholders, use + * {@link #unregisterAll(Addon)}. */ @Override public void unregisterAll() { bentoboxExpansion.getRegisteredPlaceholders().forEach(this::unregisterPlaceholder); - addonsExpansions.forEach((addon, exp) -> - exp.getRegisteredPlaceholders().forEach(ph -> this.unregisterPlaceholder(addon, ph))); + } + + /** + * Unregisters all placeholders previously registered for the given addon. + * The expansion object stays registered with PlaceholderAPI but its + * internal placeholder map is emptied. + * @param addon the addon whose placeholders should be cleared, not null. + * @since 3.4.0 + */ + public void unregisterAll(@NonNull Addon addon) { + AddonPlaceholderExpansion exp = addonsExpansions.get(addon); + if (exp != null) { + exp.getRegisteredPlaceholders().forEach(exp::unregisterPlaceholder); + } } } diff --git a/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java b/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java index 79d93485c..c4893fffa 100644 --- a/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/PlaceholdersManager.java @@ -442,13 +442,23 @@ public String replacePlaceholders(@Nullable Player player, @NonNull String strin } /** - * Unregisters all the placeholders. + * Unregisters all BentoBox-core placeholders. Placeholders registered by addons + * are intentionally preserved; use {@link #unregisterAll(Addon)} to clear those. * @since 1.15.0 */ public void unregisterAll() { getPlaceholderAPIHook().ifPresent(PlaceholderAPIHook::unregisterAll); } + /** + * Unregisters all placeholders previously registered for the given addon. + * @param addon the addon whose placeholders should be cleared, not null. + * @since 3.4.0 + */ + public void unregisterAll(@NonNull Addon addon) { + getPlaceholderAPIHook().ifPresent(hook -> hook.unregisterAll(addon)); + } + // ------------------------------------------------------------------------- // Flag placeholders // ------------------------------------------------------------------------- diff --git a/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java index 79b32b859..203b021e3 100644 --- a/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/PlaceholdersManagerTest.java @@ -297,6 +297,21 @@ void testUnregisterAllNoHook() { verify(hook, never()).unregisterAll(); } + @Test + void testUnregisterAllAddon() { + pm.unregisterAll(addon); + verify(hook).unregisterAll(addon); + } + + @Test + void testUnregisterAllAddonNoHook() { + when(hm.getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + pm = new PlaceholdersManager(plugin); + + pm.unregisterAll(addon); + verify(hook, never()).unregisterAll(addon); + } + // --------------------------------------------------------------- // getRegisteredBentoBoxPlaceholders tests // --------------------------------------------------------------- From ce9b170d52ae0439722fb0da111e953e1fb0f65c Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 8 Apr 2026 22:36:46 -0700 Subject: [PATCH 93/95] Don't clear gamemode addon placeholders on reload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clearing each gamemode's placeholders wiped out custom placeholders the gamemode addon registered itself (e.g. AOneBlock's own %aoneblock_...% placeholders), which registerDefaultPlaceholders does not rebuild. registerDefaultPlaceholders is already idempotent — BasicPlaceholderExpansion uses putIfAbsent, and registerFlagPlaceholder early-returns via isPlaceholder — so running it without pre-clearing simply adds any missing entries and leaves existing ones alone. Co-Authored-By: Claude Opus 4.6 --- .../bentobox/commands/BentoBoxReloadCommand.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java b/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java index 743794d20..68cb83e83 100644 --- a/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java +++ b/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java @@ -39,12 +39,14 @@ public boolean execute(User user, String label, List args) { if (args.isEmpty()) { this.askConfirmation(user, user.getTranslation("commands.bentobox.reload.warning"), () -> { - // Clear placeholders that this reload will rebuild. Addon-owned - // placeholders (e.g. from the Level addon) are intentionally - // preserved because reload does not re-invoke addons (#2930). + // Clear only BentoBox-core placeholders. Addon-owned placeholders + // (both gamemode defaults and any custom ones addons register + // themselves) are intentionally preserved because reload does + // not re-invoke addons (#2930). registerDefaultPlaceholders + // below is idempotent, so any newly-added flag placeholders + // will still be picked up. PlaceholdersManager pm = getPlugin().getPlaceholdersManager(); pm.unregisterAll(); - getPlugin().getAddonsManager().getGameModeAddons().forEach(pm::unregisterAll); // Close all open panels PanelListenerManager.closeAllPanels(); From f0ec8068f7734ba7edbc297ce22f760aa5b4cfc9 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 9 Apr 2026 05:26:55 -0700 Subject: [PATCH 94/95] Preserve mid-text spaces in legacy/MiniMessage round-trip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The legacy locale hack of stripping one space after a color code (so auto-translators wouldn't glue "&c" onto "Hello") was being applied unconditionally, including after &r and after mid-text color transitions. This ate inter-segment spaces in round-tripped MiniMessage — e.g. "Page [page] of ..." rendered as "Page 1of 4" because componentToLegacy emits "§7Page §e1§7 of §e4" and legacyToMiniMessage then stripped the space after the mid-text §7. Restrict the strip to boundary positions only: start of string, after whitespace, or immediately after another legacy code. Also skip §r in all cases (it's a format terminator). Applied in legacyToMiniMessage, replaceLegacyCodesInline, and stripSpaceAfterColorCodes. https://github.com/BentoBoxWorld/AOneBlock/issues/495 Co-Authored-By: Claude Opus 4.6 --- .../world/bentobox/bentobox/util/Util.java | 47 +++++++-- .../util/LegacyToMiniMessageTest.java | 98 +++++++++++++++++++ 2 files changed, 138 insertions(+), 7 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/util/Util.java b/src/main/java/world/bentobox/bentobox/util/Util.java index 95e0bd0fd..d62c3d736 100644 --- a/src/main/java/world/bentobox/bentobox/util/Util.java +++ b/src/main/java/world/bentobox/bentobox/util/Util.java @@ -704,7 +704,14 @@ public static String translateColorCodes(@NonNull String textToColor) { @NonNull public static String stripSpaceAfterColorCodes(String textToStrip) { if (textToStrip == null) return ""; - textToStrip = textToStrip.replaceAll("(\u00A7.)[\\s]", "$1"); + // The legacy locale hack of writing "&c Hello" (with an intentional space so + // primitive auto-translators wouldn't glue "&c" onto "Hello") only applies when + // the §X code appears at a boundary — start of string, after whitespace, or + // immediately after another §X code. Mid-text codes (e.g. "Page §e1§7 of §e4" + // where §7 is preceded by a digit) must NOT strip the following space, because + // that space is content, not the hack. Also skip §r (reset) in all cases. + // See https://github.com/BentoBoxWorld/AOneBlock/issues/495. + textToStrip = textToStrip.replaceAll("(?<=^|\\s|\u00A7.)(\u00A7[^rR])\\s", "$1"); return textToStrip; } @@ -1059,16 +1066,28 @@ public static String legacyToMiniMessage(@NonNull String legacy) { StringBuilder result = new StringBuilder(); List openTags = new ArrayList<>(); int i = 0; + // Tracks whether the previous character emitted was part of a legacy code we just + // consumed. Used for the boundary check on the legacy-space-stripping hack. + boolean justConsumedCode = false; while (i < text.length()) { if (i + 1 < text.length() && text.charAt(i) == '&') { char code = Character.toLowerCase(text.charAt(i + 1)); String mmTag = LEGACY_TO_MM_MAP.get(code); if (mmTag != null) { + // Boundary check: the legacy locale hack only applies when the &X code + // appears at a natural boundary — start of the string, after whitespace, + // or immediately after another legacy code. Mid-text codes (e.g. "Page + // §e1§7 of §e4" — the §7 is preceded by "1") must NOT strip the + // following space, because that space is content, not the locale hack. + // See https://github.com/BentoBoxWorld/AOneBlock/issues/495. + boolean atBoundary = i == 0 || justConsumedCode + || Character.isWhitespace(text.charAt(i - 1)); i += 2; - // Strip space after color code (the locale hack) - if (i < text.length() && text.charAt(i) == ' ') { + // &r is a format terminator; any following space is always intentional. + if (!"reset".equals(mmTag) && atBoundary && i < text.length() && text.charAt(i) == ' ') { i++; } + justConsumedCode = true; if ("reset".equals(mmTag)) { // Close all open tags for (int j = openTags.size() - 1; j >= 0; j--) { @@ -1116,6 +1135,10 @@ public static String legacyToMiniMessage(@NonNull String legacy) { if (text.charAt(i) == '<' && text.substring(i).startsWith("', i); if (end != -1) { + // Same boundary check as named &X codes — hex was originally &#RRGGBB + // in the source string, so use the same rule for its space-strip. + boolean atBoundaryHex = i == 0 || justConsumedCode + || Character.isWhitespace(text.charAt(i - 1)); String colorTag = text.substring(i + 1, end); // Close previous color tags, preserving decoration nesting List decorationsToReopen = new ArrayList<>(); @@ -1140,14 +1163,17 @@ public static String legacyToMiniMessage(@NonNull String legacy) { result.append("<").append(colorTag).append(">"); openTags.add(colorTag); i = end + 1; - // Strip space after hex color code - if (i < text.length() && text.charAt(i) == ' ') { + // Strip space after hex color code only at a boundary. + // See https://github.com/BentoBoxWorld/AOneBlock/issues/495. + if (atBoundaryHex && i < text.length() && text.charAt(i) == ' ') { i++; } + justConsumedCode = true; continue; } } result.append(text.charAt(i)); + justConsumedCode = false; i++; } // Close any remaining open tags @@ -1200,21 +1226,28 @@ public static String replaceLegacyCodesInline(@NonNull String text) { // Replace &X codes with MiniMessage tags (opening only, no closing) sb = new StringBuilder(); int i = 0; + // See legacyToMiniMessage for the rationale behind the boundary check. + boolean justConsumedCode = false; while (i < text.length()) { if (i + 1 < text.length() && text.charAt(i) == '&') { char code = Character.toLowerCase(text.charAt(i + 1)); String mmTag = LEGACY_TO_MM_MAP.get(code); if (mmTag != null) { + boolean atBoundary = i == 0 || justConsumedCode + || Character.isWhitespace(text.charAt(i - 1)); sb.append("<").append(mmTag).append(">"); i += 2; - // Strip space after color code (locale hack) - if (i < text.length() && text.charAt(i) == ' ') { + // Legacy locale hack — only strip at a boundary, and never after &r. + // See https://github.com/BentoBoxWorld/AOneBlock/issues/495. + if (!"reset".equals(mmTag) && atBoundary && i < text.length() && text.charAt(i) == ' ') { i++; } + justConsumedCode = true; continue; } } sb.append(text.charAt(i)); + justConsumedCode = false; i++; } return sb.toString(); diff --git a/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java index b1ea013b4..d76f72119 100644 --- a/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java +++ b/src/test/java/world/bentobox/bentobox/util/LegacyToMiniMessageTest.java @@ -187,4 +187,102 @@ void testBoldCarriesThroughHexColor() { "Plain text should not contain literal : " + plainText); assertEquals("Bold Red", plainText); } + + /** + * Regression for + * AOneBlock#495: a MiniMessage locale string with a space between two colored + * segments must retain the space after going through the componentToLegacy → + * legacyToMiniMessage round-trip used by {@code User.sendMessage}. + */ + @Test + void testInterSegmentSpacePreservedAcrossRoundTrip() { + String mm = "Slow down. Click slower."; + Component c = Util.parseMiniMessage(mm); + String legacy = Util.componentToLegacy(c); + + // componentToLegacy emits the §r-space-§a pattern for the inter-segment whitespace + assertTrue(legacy.contains("\u00A7r "), + "expected reset-then-space in legacy form, got: " + legacy); + + // Round-trip back through legacyToMiniMessage — the space must survive + String mmAgain = Util.legacyToMiniMessage(legacy); + assertFalse(mmAgain.contains(""), + "space was eaten between segments: " + mmAgain); + + Component c2 = Util.parseMiniMessage(mmAgain); + String plain = PlainTextComponentSerializer.plainText().serialize(c2); + assertEquals("Slow down. Click slower.", plain); + } + + /** + * Backwards compat: the legacy locale hack of stripping one space after a + * color/decoration code must still work. Old locale files use {@code &c This is red} + * so primitive auto-translators wouldn't glue the code onto the word. + */ + @Test + void testLegacyLocaleHackStillStripsSpaceAfterColorCode() { + String mm = Util.legacyToMiniMessage("&c This is red"); + assertEquals("This is red", mm); + } + + /** + * The locale hack must NOT apply to {@code &r}. &r is a format terminator and any + * following space is intentional literal whitespace. + */ + @Test + void testLegacyResetDoesNotStripFollowingSpace() { + String mm = Util.legacyToMiniMessage("&cHello&r world"); + String plain = PlainTextComponentSerializer.plainText().serialize(Util.parseMiniMessage(mm)); + assertEquals("Hello world", plain); + } + + /** + * Regression for + * AOneBlock#495: a "Page [page] of [total]" template with alternating colors. + * The round-trip emits {@code §7Page §e1§7 of §e4}. The second {@code §7} is + * preceded by a digit, not by a boundary, so the space after it is content and + * must be preserved. + */ + @Test + void testMidTextColorCodeDoesNotStripContentSpace() { + String mm = "Page 1 of 4"; + // Forward: MiniMessage → componentToLegacy + Component c = Util.parseMiniMessage(mm); + String legacy = Util.componentToLegacy(c); + // Round-trip: legacy → Component + Component finalComp = Util.parseMiniMessageOrLegacy(legacy); + String plain = PlainTextComponentSerializer.plainText().serialize(finalComp); + assertEquals("Page 1 of 4", plain); + } + + /** + * Same scenario exercised through {@code replaceLegacyCodesInline} (the mixed-content + * path used when MiniMessage templates contain legacy-coded variable substitutions). + */ + @Test + void testMidTextCodeInReplaceLegacyCodesInlinePreservesSpace() { + // Mixed content: MiniMessage tags with legacy codes embedded (e.g. from a variable). + String mixed = "Page &e1&7 of &e4"; + String result = Util.replaceLegacyCodesInline(mixed); + // The &7 here is preceded by "1" (mid-text), so the space after it must survive. + String plain = PlainTextComponentSerializer.plainText().serialize(Util.parseMiniMessage(result)); + assertEquals("Page 1 of 4", plain); + } + + /** + * {@code stripSpaceAfterColorCodes} (used by the deprecated {@code translateColorCodes} + * pure-legacy path) must use the same boundary rule. + */ + @Test + @SuppressWarnings("deprecation") + void testStripSpaceAfterColorCodesRespectsBoundary() { + // Boundary cases: strip applies + assertEquals("\u00A7cHello", Util.stripSpaceAfterColorCodes("\u00A7c Hello")); + assertEquals("\u00A7l\u00A7cBold", Util.stripSpaceAfterColorCodes("\u00A7l\u00A7c Bold")); + // Mid-text: must NOT strip + assertEquals("\u00A77Page \u00A7e1\u00A77 of \u00A7e4", + Util.stripSpaceAfterColorCodes("\u00A77Page \u00A7e1\u00A77 of \u00A7e4")); + // Reset must NOT strip + assertEquals("\u00A7r world", Util.stripSpaceAfterColorCodes("\u00A7r world")); + } } From c25e1659a831f5513dfb8159da67d59a7d202cae Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 9 Apr 2026 14:17:18 -0700 Subject: [PATCH 95/95] Support MiniMessage in welcome sign locale entries Welcome sign lines sourced from locale files went through the legacy setLine(String) API, so MiniMessage tags like ... were written verbatim. Parse each line with parseMiniMessageOrLegacy and write via SignSide.line(int, Component) so both MiniMessage and legacy color codes render correctly. Co-Authored-By: Claude Opus 4.6 --- .../bentobox/bentobox/util/DefaultPasteUtil.java | 7 ++++--- .../bentobox/util/DefaultPasteUtilTest.java | 16 ++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/util/DefaultPasteUtil.java b/src/main/java/world/bentobox/bentobox/util/DefaultPasteUtil.java index deb486a29..b83db9aa4 100644 --- a/src/main/java/world/bentobox/bentobox/util/DefaultPasteUtil.java +++ b/src/main/java/world/bentobox/bentobox/util/DefaultPasteUtil.java @@ -382,14 +382,15 @@ private static void writeLocalizedSignText(SignSide signSide, Island island, Lis Optional user = Optional.ofNullable(island.getOwner()).map(User::getInstance); if (user.isPresent()) { for (int i = 0; i < 4; i++) { - signSide.setLine(i, Util.translateColorCodes(plugin.getLocalesManager().getOrDefault(user.get(), - addonName + ".sign.line" + i, "").replace(TextVariables.NAME, name))); + String raw = plugin.getLocalesManager().getOrDefault(user.get(), + addonName + ".sign.line" + i, "").replace(TextVariables.NAME, name); + signSide.line(i, Util.parseMiniMessageOrLegacy(raw)); } } } else { // Just paste for (int i = 0; i < 4; i++) { - signSide.setLine(i, lines.get(i)); + signSide.line(i, Util.parseMiniMessageOrLegacy(lines.get(i))); } } } diff --git a/src/test/java/world/bentobox/bentobox/util/DefaultPasteUtilTest.java b/src/test/java/world/bentobox/bentobox/util/DefaultPasteUtilTest.java index 2588bc591..844d2c47c 100644 --- a/src/test/java/world/bentobox/bentobox/util/DefaultPasteUtilTest.java +++ b/src/test/java/world/bentobox/bentobox/util/DefaultPasteUtilTest.java @@ -456,10 +456,10 @@ void testWriteSignNormalPastesLines() { DefaultPasteUtil.writeSign(island, block, bpBlock, Side.FRONT); - verify(signSide).setLine(0, "line0"); - verify(signSide).setLine(1, "line1"); - verify(signSide).setLine(2, "line2"); - verify(signSide).setLine(3, "line3"); + verify(signSide).line(0, Component.text("line0")); + verify(signSide).line(1, Component.text("line1")); + verify(signSide).line(2, Component.text("line2")); + verify(signSide).line(3, Component.text("line3")); verify(signSide).setGlowingText(true); verify(signState).update(); } @@ -477,7 +477,7 @@ void testWriteSignSpawnHereSetsAirAndSpawnPoint() { verify(block).setType(Material.AIR); verify(island).setSpawnPoint(eq(Environment.NORMAL), any(org.bukkit.Location.class)); // Normal paste logic must NOT run - verify(signSide, never()).setLine(any(Integer.class), anyString()); + verify(signSide, never()).line(any(Integer.class), any(Component.class)); } @Test @@ -505,7 +505,7 @@ void testWriteSignSpawnHereOnBackSideIgnored() { DefaultPasteUtil.writeSign(island, block, bpBlock, Side.BACK); verify(block, never()).setType(any()); - verify(signSide).setLine(0, "[spawn_here]"); + verify(signSide).line(0, Component.text("[spawn_here]")); } @Test @@ -516,7 +516,7 @@ void testWriteSignSpawnHereNullIslandPastesNormally() { DefaultPasteUtil.writeSign(null, block, bpBlock, Side.FRONT); verify(block, never()).setType(any()); - verify(signSide).setLine(0, "[spawn_here]"); + verify(signSide).line(0, Component.text("[spawn_here]")); } @Test @@ -556,6 +556,6 @@ void testWriteSignWallSignUsesWallSignFacing() { DefaultPasteUtil.writeSign(island, block, bpBlock, Side.FRONT); // Should complete without error (WallSign branch taken) - verify(signSide).setLine(0, "text"); + verify(signSide).line(0, Component.text("text")); } }