diff --git a/CHANGELOG.md b/CHANGELOG.md index f74689dc..4fcd0f63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ### Tweaks -* Added "Hidden" option for status effect display location #517 +* Tweak a small few recipe IDs to be synthetic when they previously weren't +* Updated config UI on modern versions to be more similar to vanilla changes +* Tweaked "default stack" bind to also toggle during resolution ### Fixes -* Properly implement JEI fixes in 1.20.1 #743 +* Added additional dev mode nags for synthetic IDs #730 +* Added further safety around recipe baking to prevent self mutation from affecting EMI significantly #776 +* Further update JEI integration with null backgrounds #755 diff --git a/fabric/src/main/java/dev/emi/emi/platform/fabric/EmiAgnosFabric.java b/fabric/src/main/java/dev/emi/emi/platform/fabric/EmiAgnosFabric.java index 4b53e8f5..c8be58ef 100644 --- a/fabric/src/main/java/dev/emi/emi/platform/fabric/EmiAgnosFabric.java +++ b/fabric/src/main/java/dev/emi/emi/platform/fabric/EmiAgnosFabric.java @@ -174,7 +174,7 @@ protected void addBrewingRecipesAgnos(EmiRegistry registry) { String oid = EmiUtil.subId(recipe.to().value()); Consumer> potionRecipeGen = entry -> { if (brewingRegistry.isBrewable(entry)) { - Identifier id = EmiPort.id("emi", "brewing/item/" + Identifier id = EmiPort.id("emi", "/brewing/item/" + EmiUtil.subId(entry.getKey().get().getValue()) + "/" + gid + "/" + iid + "/" + oid); registry.addRecipe(new EmiBrewingRecipe( EmiStack.of(EmiPort.setPotion(new ItemStack(recipe.from().value()), entry.value())), EmiIngredient.of(recipeIngredient), diff --git a/gradle.properties b/gradle.properties index ba8d1dac..9ef84512 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.20.6 enabled_platforms=fabric,neoforge archives_base_name=emi -mod_version=1.1.16 +mod_version=1.1.17 maven_group=dev.emi architectury_version=4.9.83 diff --git a/neoforge/src/main/java/dev/emi/emi/platform/neoforge/EmiAgnosNeoForge.java b/neoforge/src/main/java/dev/emi/emi/platform/neoforge/EmiAgnosNeoForge.java index 4cf1764d..125740c2 100644 --- a/neoforge/src/main/java/dev/emi/emi/platform/neoforge/EmiAgnosNeoForge.java +++ b/neoforge/src/main/java/dev/emi/emi/platform/neoforge/EmiAgnosNeoForge.java @@ -190,7 +190,7 @@ protected void addBrewingRecipesAgnos(EmiRegistry registry) { Consumer> potionRecipeGen = entry -> { Potion potion = entry.value(); if (brewingRegistry.isBrewable(entry)) { - Identifier id = EmiPort.id("emi", "brewing/item/" + Identifier id = EmiPort.id("emi", "/brewing/item/" + EmiUtil.subId(entry.getKey().get().getValue()) + "/" + gid + "/" + iid + "/" + oid); registry.addRecipe(new EmiBrewingRecipe( EmiStack.of(EmiPort.setPotion(new ItemStack(recipe.from().value()), potion)), EmiIngredient.of(recipe.ingredient()), @@ -215,7 +215,7 @@ protected void addBrewingRecipesAgnos(EmiRegistry registry) { EmiStack input = EmiStack.of(is); EmiIngredient ingredient = EmiIngredient.of(recipe.getIngredient()); EmiStack output = EmiStack.of(recipe.getOutput(is, recipe.getIngredient().getMatchingStacks()[0])); - Identifier id = EmiPort.id("emi", "brewing/neoforge/" + Identifier id = EmiPort.id("emi", "/brewing/neoforge/" + EmiUtil.subId(input.getId()) + "/" + EmiUtil.subId(ingredient.getEmiStacks().get(0).getId()) + "/" + EmiUtil.subId(output.getId())); diff --git a/xplat/src/main/java/dev/emi/emi/EmiPort.java b/xplat/src/main/java/dev/emi/emi/EmiPort.java index 17de6a0c..3c6685e4 100644 --- a/xplat/src/main/java/dev/emi/emi/EmiPort.java +++ b/xplat/src/main/java/dev/emi/emi/EmiPort.java @@ -233,4 +233,8 @@ public static Identifier id(String id) { public static Identifier id(String namespace, String path) { return new Identifier(namespace, path); } + + public static void applyModelViewMatrix() { + RenderSystem.applyModelViewMatrix(); + } } diff --git a/xplat/src/main/java/dev/emi/emi/api/widget/SlotWidget.java b/xplat/src/main/java/dev/emi/emi/api/widget/SlotWidget.java index a7edd161..0f44566d 100644 --- a/xplat/src/main/java/dev/emi/emi/api/widget/SlotWidget.java +++ b/xplat/src/main/java/dev/emi/emi/api/widget/SlotWidget.java @@ -283,7 +283,11 @@ private boolean slotInteraction(Function function) { EmiRecipe recipe = getRecipe(); if (canResolve()) { if (function.apply(EmiConfig.defaultStack)) { - BoM.addRecipe(RecipeScreen.resolve, recipe); + if (BoM.isDefaultRecipe(RecipeScreen.resolve, recipe)) { + BoM.removeRecipe(RecipeScreen.resolve, recipe); + } else { + BoM.addRecipe(RecipeScreen.resolve, recipe); + } EmiHistory.pop(); return true; } else if (function.apply(EmiConfig.viewRecipes)) { diff --git a/xplat/src/main/java/dev/emi/emi/jemi/JemiRecipe.java b/xplat/src/main/java/dev/emi/emi/jemi/JemiRecipe.java index 59cd297e..56da717c 100644 --- a/xplat/src/main/java/dev/emi/emi/jemi/JemiRecipe.java +++ b/xplat/src/main/java/dev/emi/emi/jemi/JemiRecipe.java @@ -20,6 +20,7 @@ import dev.emi.emi.runtime.EmiDrawContext; import dev.emi.emi.screen.EmiScreenManager; import mezz.jei.api.gui.IRecipeLayoutDrawable; +import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.recipe.RecipeIngredientRole; import mezz.jei.api.recipe.category.IRecipeCategory; import mezz.jei.library.focus.FocusGroup; @@ -161,7 +162,10 @@ public void render(DrawContext draw, int mouseX, int mouseY, float delta) { EmiDrawContext context = EmiDrawContext.wrap(draw); context.push(); context.matrices().translate(x, y, 0); - category.getBackground().draw(context.raw()); + IDrawable background = category.getBackground(); + if (background != null) { + background.draw(context.raw()); + } category.draw(recipe, recipeLayoutDrawable.getRecipeSlotsView(), context.raw(), mouseX, mouseY); context.resetColor(); context.pop(); diff --git a/xplat/src/main/java/dev/emi/emi/registry/EmiRecipes.java b/xplat/src/main/java/dev/emi/emi/registry/EmiRecipes.java index cebede19..ba33b949 100644 --- a/xplat/src/main/java/dev/emi/emi/registry/EmiRecipes.java +++ b/xplat/src/main/java/dev/emi/emi/registry/EmiRecipes.java @@ -156,6 +156,7 @@ public Manager(List categories, Map duplicateIds = new Object2IntOpenHashMap<>(); + Set incorrectIds = new ObjectArraySet<>(); for (EmiRecipe recipe : recipes) { Identifier id = recipe.getId(); EmiRecipeCategory category = recipe.getCategory(); @@ -178,6 +179,10 @@ public Manager(List categories, Map categories, Map> byInput = new Object2ObjectOpenCustomHashMap<>(new EmiStackList.ComparisonHashStrategy()); @@ -215,13 +223,28 @@ public Manager(List categories, Map r = byInput.getOrDefault(key, null); + if (r != null) { + this.byInput.put(key, r.stream().toList()); + } else { + EmiReloadLog.warn("Stack illegally self-mutated during recipe bake, causing recipe loss: " + key); + } } for (EmiStack key : byOutput.keySet()) { - this.byOutput.put(key, byOutput.get(key).stream().toList()); + Set r = byOutput.getOrDefault(key, null); + if (r != null) { + this.byOutput.put(key, r.stream().toList()); + } else { + EmiReloadLog.warn("Stack illegally self-mutated during recipe bake, causing recipe loss: " + key); + } } for (EmiRecipeCategory category : workstations.keySet()) { - workstations.put(category, workstations.get(category).stream().distinct().toList()); + List w = workstations.getOrDefault(category, null); + if (w != null) { + workstations.put(category, w.stream().distinct().toList()); + } else { + EmiReloadLog.warn("Recipe category illegally self-mutated during recipe bake, causing recipe loss: " + category); + } } for (Map.Entry> entry : byCategory.entrySet()) { for (EmiIngredient ingredient : workstations.getOrDefault(entry.getKey(), List.of())) { @@ -233,6 +256,7 @@ public Manager(List categories, Map duplicateRecipeIds = Set.of(); + public static Set incorrectRecipeIds = Set.of(); } diff --git a/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java b/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java index c8396194..6f6eca27 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java +++ b/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java @@ -219,7 +219,7 @@ public void render(DrawContext raw, int mouseX, int mouseY, float delta) { view.translate(width / 2, height / 2, 0); view.scale(scale, scale, 1); view.translate((float)offX, (float)offY, 0); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); if (BoM.tree != null) { batcher.begin(0, 0, 0); int cy = nodeHeight * NODE_VERTICAL_SPACING * 2; @@ -254,7 +254,7 @@ public void render(DrawContext raw, int mouseX, int mouseY, float delta) { } view.popMatrix(); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); if (help.contains(mouseX, mouseY)) { context.setColor(0.5f, 0.6f, 1f, 1f); diff --git a/xplat/src/main/java/dev/emi/emi/screen/ConfigScreen.java b/xplat/src/main/java/dev/emi/emi/screen/ConfigScreen.java index c9783454..681f7c3a 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/ConfigScreen.java +++ b/xplat/src/main/java/dev/emi/emi/screen/ConfigScreen.java @@ -366,19 +366,13 @@ public void updateChanges() { public void render(DrawContext raw, int mouseX, int mouseY, float delta) { EmiDrawContext context = EmiDrawContext.wrap(raw); list.setScrollAmount(list.getScrollAmount()); - this.renderDarkening(context.raw()); - list.render(context.raw(), mouseX, mouseY, delta); super.render(context.raw(), mouseX, mouseY, delta); + list.render(context.raw(), mouseX, mouseY, delta); if (list.getHoveredEntry() != null) { EmiRenderHelper.drawTooltip(this, context, list.getHoveredEntry().getTooltip(mouseX, mouseY), mouseX, mouseY, Math.min(width / 2 - 16, maxWidth)); } } - @Override - public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { - // Prevent double background draw - } - @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (activeBind != null) { diff --git a/xplat/src/main/java/dev/emi/emi/screen/EmiScreenManager.java b/xplat/src/main/java/dev/emi/emi/screen/EmiScreenManager.java index 44f1bc5b..0482d4a8 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/EmiScreenManager.java +++ b/xplat/src/main/java/dev/emi/emi/screen/EmiScreenManager.java @@ -60,6 +60,7 @@ import dev.emi.emi.runtime.EmiHidden; import dev.emi.emi.runtime.EmiHistory; import dev.emi.emi.runtime.EmiLog; +import dev.emi.emi.runtime.EmiProfiler; import dev.emi.emi.runtime.EmiReloadLog; import dev.emi.emi.runtime.EmiReloadManager; import dev.emi.emi.runtime.EmiSidebars; @@ -576,7 +577,7 @@ public static void drawBackground(EmiDrawContext context, int mouseX, int mouseY recalculate(); EmiScreenBase base = EmiScreenBase.getCurrent(); if (base != null) { - client.getProfiler().push("sidebar"); + EmiProfiler.push("sidebar"); for (SidebarPanel panel : panels) { panel.drawBackground(context, mouseX, mouseY, delta); } @@ -584,7 +585,7 @@ public static void drawBackground(EmiDrawContext context, int mouseX, int mouseY } public static void render(EmiDrawContext context, int mouseX, int mouseY, float delta) { - client.getProfiler().push("emi"); + EmiProfiler.push("emi"); updateMouse(mouseX, mouseY); recalculate(); EmiScreenBase base = EmiScreenBase.getCurrent(); @@ -612,7 +613,7 @@ public static void render(EmiDrawContext context, int mouseX, int mouseY, float } } } - client.getProfiler().pop(); + EmiProfiler.pop(); lastHoveredCraftable = null; return; } else if (EmiRecipes.activeWorker != null) { @@ -621,20 +622,20 @@ public static void render(EmiDrawContext context, int mouseX, int mouseY, float renderDevMode(context, mouseX, mouseY, delta, base); } renderWidgets(context, mouseX, mouseY, delta, base); - client.getProfiler().push("sidebars"); + EmiProfiler.push("sidebars"); for (SidebarPanel panel : panels) { panel.render(context, mouseX, mouseY, delta); } renderLastHoveredCraftable(context, mouseX, mouseY, delta, base); - client.getProfiler().pop(); + EmiProfiler.pop(); renderExclusionAreas(context, mouseX, mouseY, delta, base); - client.getProfiler().swap("slots"); + EmiProfiler.swap("slots"); renderSlotOverlays(context, mouseX, mouseY, delta, base); - client.getProfiler().pop(); + EmiProfiler.pop(); RenderSystem.disableDepthTest(); } @@ -665,14 +666,14 @@ private static void renderLastHoveredCraftable(EmiDrawContext context, int mouse Matrix4fStack view = RenderSystem.getModelViewStack(); view.pushMatrix(); view.translate(0, 0, 200); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); int lhx = space.getRawX(lastHoveredCraftableOffset); int lhy = space.getRawY(lastHoveredCraftableOffset); context.fill(lhx, lhy, 18, 18, 0x44AA00FF); lastHoveredCraftable.getStack().render(context.raw(), lhx + 1, lhy + 1, delta, EmiIngredient.RENDER_ICON); view.popMatrix(); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); } } } @@ -729,7 +730,7 @@ private static void renderCurrentTooltip(EmiDrawContext context, int mouseX, int } } if (cursor.isEmpty() && draggedStack.isEmpty()) { - client.getProfiler().swap("hover"); + EmiProfiler.swap("hover"); EmiIngredient hov = EmiStack.EMPTY; SidebarType sidebar = SidebarType.NONE; if (getHoveredStack(mouseX, mouseY, false) instanceof SidebarEmiStackInteraction sesi) { @@ -753,7 +754,7 @@ private static void renderCurrentTooltip(EmiDrawContext context, int mouseX, int } else { EmiRenderHelper.drawTooltip(base.screen(), context, list, mouseX, mouseY); } - client.getProfiler().pop(); + EmiProfiler.pop(); } lastStackTooltipRendered = null; } @@ -761,7 +762,7 @@ private static void renderCurrentTooltip(EmiDrawContext context, int mouseX, int private static void renderDevMode(EmiDrawContext context, int mouseX, int mouseY, float delta, EmiScreenBase base) { if (EmiConfig.devMode) { Screen screen = base.screen(); - client.getProfiler().swap("dev"); + EmiProfiler.swap("dev"); int color = 0xFFFFFF; Text title = EmiPort.literal("EMI Dev Mode"); int off = -16; @@ -1435,7 +1436,7 @@ public void render(EmiDrawContext context, int mouseX, int mouseY, float delta) } } if (isVisible()) { - client.getProfiler().swap(side.getName()); + EmiProfiler.swap(side.getName()); context.push(); context.matrices().translate(0, 0, 100); pageLeft.render(context.raw(), mouseX, mouseY, delta); diff --git a/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java b/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java index d03307dd..cdf9c0b1 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java +++ b/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java @@ -220,7 +220,7 @@ public void render(DrawContext raw, int mouseX, int mouseY, float delta) { int my = mouseY - group.y(); context.push(); context.matrices().translate(group.x(), group.y(), 0); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); try { for (Widget widget : group.widgets) { widget.render(context.raw(), mx, my, delta); @@ -244,7 +244,7 @@ public void render(DrawContext raw, int mouseX, int mouseY, float delta) { } } context.pop(); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); } EmiScreenManager.drawBackground(context, mouseX, mouseY, delta); EmiScreenManager.render(context, mouseX, mouseY, delta); diff --git a/xplat/src/main/java/dev/emi/emi/screen/WidgetGroup.java b/xplat/src/main/java/dev/emi/emi/screen/WidgetGroup.java index 9b4f9490..2ef7dc6e 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/WidgetGroup.java +++ b/xplat/src/main/java/dev/emi/emi/screen/WidgetGroup.java @@ -79,6 +79,11 @@ public void decorateDevMode() { tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.synthetic_id")); } errors.add(new RecipeError(RecipeError.Severity.ERROR, tooltip)); + } else if (EmiDev.incorrectRecipeIds.contains(id)) { + List tooltip = Lists.newArrayList(); + tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.synthetic_nag_explanation", id)); + tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.synthetic_id")); + errors.add(new RecipeError(RecipeError.Severity.ERROR, tooltip)); } if (recipe.getInputs() == null || recipe.getOutputs() == null || recipe.getCatalysts() == null) { diff --git a/xplat/src/main/java/dev/emi/emi/screen/widget/EmiSearchWidget.java b/xplat/src/main/java/dev/emi/emi/screen/widget/EmiSearchWidget.java index c325d15b..c4680e90 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/widget/EmiSearchWidget.java +++ b/xplat/src/main/java/dev/emi/emi/screen/widget/EmiSearchWidget.java @@ -243,7 +243,7 @@ public void renderWidget(DrawContext raw, int mouseX, int mouseY, float delta) { view.translate(this.x + this.width / 2, this.y + this.height / 2, 0); view.rotate(RotationAxis.NEGATIVE_Z.rotationDegrees(deg)); view.translate(-(this.x + this.width / 2), -(this.y + this.height / 2), 0); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); } if (lower.contains("jeb_")) { @@ -265,6 +265,6 @@ public void renderWidget(DrawContext raw, int mouseX, int mouseY, float delta) { } context.resetColor(); view.popMatrix(); - RenderSystem.applyModelViewMatrix(); + EmiPort.applyModelViewMatrix(); } } diff --git a/xplat/src/main/java/dev/emi/emi/screen/widget/config/ConfigJumpButton.java b/xplat/src/main/java/dev/emi/emi/screen/widget/config/ConfigJumpButton.java index bfd45560..c6e5e941 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/widget/config/ConfigJumpButton.java +++ b/xplat/src/main/java/dev/emi/emi/screen/widget/config/ConfigJumpButton.java @@ -26,7 +26,10 @@ public void renderWidget(DrawContext raw, int mouseX, int mouseY, float delta) { if (this.isMouseOver(mouseX, mouseY)) { context.setColor(0.5f, 0.6f, 1f); } + context.push(); + context.matrices().translate(0, 0, 100); super.renderWidget(raw, mouseX, mouseY, delta); + context.pop(); context.resetColor(); } } diff --git a/xplat/src/main/java/dev/emi/emi/screen/widget/config/ListWidget.java b/xplat/src/main/java/dev/emi/emi/screen/widget/config/ListWidget.java index 0ad84d05..10e76e11 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/widget/config/ListWidget.java +++ b/xplat/src/main/java/dev/emi/emi/screen/widget/config/ListWidget.java @@ -5,6 +5,7 @@ import java.util.Objects; import java.util.function.Predicate; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; @@ -36,6 +37,9 @@ * This is the lesser of two evils, at least this way I have vanilla compat. */ public class ListWidget extends AbstractParentElement implements Drawable, Selectable { + private static final Identifier MENU_LIST_BACKGROUND_TEXTURE = EmiPort.id("minecraft", "textures/gui/menu_list_background.png"); + private static final Identifier INWORLD_MENU_LIST_BACKGROUND_TEXTURE = EmiPort.id("minecraft", "textures/gui/inworld_menu_list_background.png"); + protected final MinecraftClient client; private final List children = Lists.newArrayList(); protected int width; @@ -185,10 +189,12 @@ public void render(DrawContext draw, int mouseX, int mouseY, float delta) { .next(); tessellator.draw(); } - + + draw.enableScissor(left, top, right, bottom); int k = this.getRowLeft(); int l = this.top + 4 - (int)this.getScrollAmount(); this.renderList(draw, k, l, mouseX, mouseY, delta); + draw.disableScissor(); { // Render horizontal shadows diff --git a/xplat/src/main/java/dev/emi/emi/search/EmiSearch.java b/xplat/src/main/java/dev/emi/emi/search/EmiSearch.java index da7947d7..626fed13 100644 --- a/xplat/src/main/java/dev/emi/emi/search/EmiSearch.java +++ b/xplat/src/main/java/dev/emi/emi/search/EmiSearch.java @@ -34,7 +34,19 @@ import net.minecraft.util.Identifier; public class EmiSearch { - public static final Pattern TOKENS = Pattern.compile("(-?[@#]?\\/(\\\\.|[^\\\\\\/])+\\/|[^\\s]+)"); + public static final Pattern TOKENS = Pattern.compile( + "-?[@#$]?" // Any query can be negated or prefixed with type + + "(" // Query contents + + "\\/(\\\\.|[^\\\\\\/])+\\/" // Any regex contents, for example `/some thing/` + + "|" + + "\\\"(\\.|[^\\\"])+\\\"" // Any quoted contents, for example, `"some thing"` + + "|" + + "[^\\s|]+" // Any raw contents, split on space + + "|" + + "\\|" // Literal OR symbol + + "|" + + "\\&" // Literal AND symbol (currently ignored since queries AND by deafult, but parsed) + + ")"); private static volatile SearchWorker currentWorker = null; public static volatile Thread searchThread = null; public static volatile List stacks = EmiStackList.stacks; @@ -147,13 +159,6 @@ public CompiledQuery(String query) { Matcher matcher = TOKENS.matcher(query); while (matcher.find()) { String q = matcher.group(); - if (q.equals("|")) { - if (!queries.isEmpty()) { - full.add(new LogicalAndQuery(queries)); - queries = Lists.newArrayList(); - } - continue; - } boolean negated = q.startsWith("-"); if (negated) { q = q.substring(1); @@ -161,6 +166,16 @@ public CompiledQuery(String query) { if (q.isEmpty()) { continue; } + if (q.equals("&")) { + // Default behavior + continue; + } else if (q.equals("|")) { + if (!queries.isEmpty()) { + full.add(new LogicalAndQuery(queries)); + queries = Lists.newArrayList(); + } + continue; + } QueryType type = QueryType.fromString(q); Function constructor = type.queryConstructor; Function regexConstructor = type.regexQueryConstructor; @@ -219,6 +234,8 @@ private static void addQuery(String s, boolean negated, List queries, Fun Query q; if (s.length() > 1 && s.startsWith("/") && s.endsWith("/")) { q = regex.apply(s.substring(1, s.length() - 1)); + } else if (s.length() > 1 && s.startsWith("\"") && s.endsWith("\"")) { + q = normal.apply(s.substring(1, s.length() - 1)); } else { q = normal.apply(s); } diff --git a/xplat/src/main/resources/assets/emi/lang/en_us.json b/xplat/src/main/resources/assets/emi/lang/en_us.json index 0e04fac9..d01b939e 100644 --- a/xplat/src/main/resources/assets/emi/lang/en_us.json +++ b/xplat/src/main/resources/assets/emi/lang/en_us.json @@ -197,7 +197,7 @@ "emi.too_small": "Crafting grid too small to fit ingredients", "emi.favorite_recipe": "Press %s to favorite recipe", "emi.resolve.resolve": "Press %s to use for this recipe tree", - "emi.resolve.default": "Press %s to default for all trees", + "emi.resolve.default": "Press %s to toggle default for all trees", "emi.page": "Page %s of %s", "emi.page.short": "%s/%s", "emi.total_cost": "Total Cost", @@ -264,6 +264,7 @@ "emi.dev.suggest_id": "Use a synthetic ID §7[namespace]§b:/§7[path]§r like\n§7%s§b:/§7%s§r", "emi.dev.null_input_or_output": "Recipe's inputs or outputs are §7null§r\nUse an empty list for no inputs or outputs\nUse §7EmiStack.EMPTY§r to represent an empty stack", "emi.dev.no_output_slots": "Recipe's slots do not include any outputs\nCall §7SlotWidget.recipeContext(this)§r on outputs§r", + "emi.dev.synthetic_nag_explanation": "Recipe ID could not be found in the recipe manager, but is not synthetic\n§7%s§r\nIf a recipe does not correspond to a data driven JSON recipe, it should use a synthetic ID", "emi.chess.piece.white_pawn": "White Pawn", "emi.chess.piece.white_rook": "White Rook", diff --git a/xplat/src/main/resources/assets/emi/lang/es_es.json b/xplat/src/main/resources/assets/emi/lang/es_es.json new file mode 100644 index 00000000..b5648543 --- /dev/null +++ b/xplat/src/main/resources/assets/emi/lang/es_es.json @@ -0,0 +1,870 @@ +{ + "key.keyboard.control": "Ctrl", + "key.keyboard.alt": "Alt", + "key.keyboard.shift": "Shift", + + "key.emi.toggle_visibility": "Alternar Visibilidad", + "key.emi.focus_search": "Enfocar Barra de Búsqueda", + "key.emi.clear_search": "Limpiar Barra de Búsqueda", + "key.emi.view_recipes": "Ver Recetas", + "key.emi.view_uses": "Ver Usos", + "key.emi.favorite": "Añadir Favorito", + "key.emi.set_default": "Establecer Por Defecto", + "key.emi.default_stack": "Establecer Stack por Defecto", + "key.emi.view_stack_tree": "Ver Árbol de Objeto", + "key.emi.view_tree": "Ver Árbol de Recetas", + "key.emi.back": "Volver", + "key.emi.forward": "Avanzar", + "key.emi.craft_one": "Fabricar Uno", + "key.emi.craft_all": "Fabricar Todos", + "key.emi.craft_one_to_inventory": "Fabricar Uno al Inventario", + "key.emi.craft_all_to_inventory": "Fabricar Todos al Inventario", + "key.emi.craft_one_to_cursor": "Fabricar Uno al Cursor", + "key.emi.show_craft": "Mostrar Receta", + "key.emi.cheat_one_to_inventory": "Robar Uno al Inventario", + "key.emi.cheat_stack_to_inventory": "Robar Stack al Inventario", + "key.emi.cheat_one_to_cursor": "Robar Uno al Cursor", + "key.emi.cheat_stack_to_cursor": "Robar Stack al Cursor", + "key.emi.delete_cursor_stack": "Borrar Stack del Cursor", + "key.emi.copy_recipe_id": "Copiar ID de Receta", + "key.emi.hide_stack": "Ocultar Stack", + "key.emi.hide_stack_by_id": "Ocultar Stack por ID", + + "config.emi.tooltip.binds.toggle_visibility": "Alterna la Visibilidad de EMI.", + "config.emi.tooltip.binds.focus_search": "Enfoca la barra de búsqueda.", + "config.emi.tooltip.binds.clear_search": "Vacía la barra de búsqueda.", + "config.emi.tooltip.binds.view_recipes": "Muestra las posibles recetas para fabricar un objeto.", + "config.emi.tooltip.binds.view_uses": "Muestra los posibles usos de un objeto en otras recetas.", + "config.emi.tooltip.binds.favorite": "Agrega el objeto a favoritos para acceder a él más fácilmente.", + "config.emi.tooltip.binds.set_default": "Establece un objeto por defecto para la receta.", + "config.emi.tooltip.binds.default_stack": "Establece el stack por defecto para la receta.", + "config.emi.tooltip.binds.view_stack_tree": "Muestra el árbol de recetas para un stack.", + "config.emi.tooltip.binds.view_tree": "Muestra el árbol de recetas para un objeto.", + "config.emi.tooltip.binds.back": "Regresa a la página anterior de EMI.", + "config.emi.tooltip.binds.forward": "Avanza a la siguiente página de EMI.", + "config.emi.tooltip.binds.craft_one": "Mueve a la cuadrícula los objetos necesarios para fabricar una unidad del objeto seleccionado.", + "config.emi.tooltip.binds.craft_all": "Mueve a la cuadrícula los objetos necesarios para fabricar la cantidad máxima posible del objeto seleccionado.", + "config.emi.tooltip.binds.craft_one_to_inventory": "Mueve a la cuadrícula los objetos necesarios para fabricar una unidad del objeto seleccionado y lo mueve al inventario si hay espacio.", + "config.emi.tooltip.binds.craft_all_to_inventory": "Mueve a la cuadrícula los objetos necesarios para fabricar la cantidad máxima posible del objeto seleccionado y lo mueve al inventario si hay espacio.", + "config.emi.tooltip.binds.craft_one_to_cursor": "Mueve a la cuadrícula los objetos necesarios para fabricar una unidad del objeto seleccionado y lo envía al cursor si es posible.", + "config.emi.tooltip.binds.show_craft": "Muestra la receta para fabricar un objeto.", + "config.emi.tooltip.binds.cheat_one_to_inventory": "Roba una unidad del objeto seleccionado y lo añade al inventario si hay espacio.", + "config.emi.tooltip.binds.cheat_stack_to_inventory": "Roba un stack del objeto seleccionado y lo añade al inventario si hay espacio.", + "config.emi.tooltip.binds.cheat_one_to_cursor": "Roba una unidad del objeto seleccionado y lo añade al cursor si es posible.", + "config.emi.tooltip.binds.cheat_stack_to_cursor": "Roba un stack del objeto seleccionado y lo añade al cursor si es posible.", + "config.emi.tooltip.binds.delete_cursor_stack": "Elimina un stack del objeto seleccionado en el índice.", + "config.emi.tooltip.binds.copy_recipe_id": "Copia el ID de la receta actual para el objeto seleccionado.", + "config.emi.tooltip.binds.hide_stack": "En el Modo Edición, oculta el objeto seleccionado.", + "config.emi.tooltip.binds.hide_stack_by_id": "En el Modo Edición, oculta todos los objetos con el ID del objeto seleccionado.", + + "emi.index_source.creative": "Creativo", + "emi.index_source.registered": "Registrado", + "emi.index_source.creative_plus_registered": "Creativo + Registrado", + "emi.help_level.verbose": "Detallado", + "emi.help_level.normal": "Normal", + "emi.help_level.none": "Ninguno", + "emi.align.horizontal.left": "Izquierda", + "emi.align.horizontal.center": "Centro", + "emi.align.horizontal.right": "Derecha", + "emi.align.vertical.top": "Arriba", + "emi.align.vertical.center": "Centro", + "emi.align.vertical.bottom": "Abajo", + "emi.sidebar.type.none": "Ninguno", + "emi.sidebar.type.index": "Índice", + "emi.sidebar.type.craftables": "Fabricables", + "emi.sidebar.type.favorites": "Favoritos", + "emi.sidebar.type.lookup_history": "Historial de Búsqueda", + "emi.sidebar.type.craft_history": "Historial de Fabricación", + "emi.sidebar.type.chess": "Ajedrez", + "emi.sidebar.theme.transparent": "Transparente", + "emi.sidebar.theme.vanilla": "Vanilla", + "emi.sidebar.theme.modern": "Modernizado", + "emi.header.visible": "Visible", + "emi.header.invisible": "Invisible", + "emi.sidebar.size.columns": "Columnas", + "emi.sidebar.size.rows": "Filas", + "emi.sidebar.margins.top": "Superior", + "emi.sidebar.margins.right": "Derecho", + "emi.sidebar.margins.bottom": "Inferior", + "emi.sidebar.margins.left": "Izquierdo", + "emi.sidebar.none": "Ninguno", + "emi.sidebar.left": "Izquierda", + "emi.sidebar.right": "Derecha", + "emi.sidebar.top": "Superior", + "emi.sidebar.bottom": "Inferior", + "emi.effect_location.top": "Arriba", + "emi.effect_location.left_compressed": "Izquierda (Comprimido)", + "emi.effect_location.right_compressed": "Derecha (Comprimido)", + "emi.effect_location.left": "Izquierda", + "emi.effect_location.right": "Derecha", + "emi.recipe_book_action.default": "Por Defecto", + "emi.recipe_book_action.toggle_craftables": "Alternar Fabricables", + "emi.recipe_book_action.toggle_visibility": "Alternar Visibilidad de EMI", + + "config.emi.group.general": "General", + "config.emi.group.general.search": "Búsqueda", + "config.emi.group.ui": "Interfaz", + "config.emi.group.ui.mod_id": "ID del Mod", + "config.emi.group.ui.recipe_screen": "Vista de Recetas", + "config.emi.group.ui.recipe_buttons": "Botones de Recetas", + "config.emi.group.ui.left_sidebar": "Barra Lateral Izquierda", + "config.emi.group.ui.right_sidebar": "Barra Lateral Derecha", + "config.emi.group.ui.top_sidebar": "Barra Superior", + "config.emi.group.ui.bottom_sidebar": "Barra Inferior", + "config.emi.group.binds": "Asignaciones", + "config.emi.group.dev": "Desarrollador", + + "config.emi.group.binds.crafts": "Fabricación", + "config.emi.group.binds.cheats": "Trucos", + + "config.emi.general.enabled": "Activar EMI", + "config.emi.general.cheat_mode": "Modo Trucos", + "config.emi.general.help_level": "Nivel de Ayuda", + "config.emi.general.index_source": "Fuente del Índice", + "config.emi.general.search_tooltip_by_default": "Buscar por Descripción de Objeto", + "config.emi.general.search_mod_name_by_default": "Buscar por Nombre de Mod", + "config.emi.general.search_tags_by_default": "Buscar por Etiquetas", + + "config.emi.tooltip.general.enabled": "Determina si EMI está activado y visible.", + "config.emi.tooltip.general.cheat_mode": "Determina si es posible robar objetos del índice.", + "config.emi.tooltip.general.help_level": "Establece el nivel de ayuda de EMI a la hora de mostrar controles y sugerencias.", + "config.emi.tooltip.general.index_source": "Determina dónde debe buscar EMI los objetos para construir el índice.", + "config.emi.tooltip.general.search_tooltip_by_default": "Determina si se pueden buscar objetos por su descripción.", + "config.emi.tooltip.general.search_mod_name_by_default": "Determina si se pueden buscar objetos por el nombre del mod.", + "config.emi.tooltip.general.search_tags_by_default": "Determina si se pueden buscar objetos por sus etiquetas.", + + "config.emi.ui.effect_location": "Ubicación de Efectos", + "config.emi.ui.center_search_bar": "Centrar Barra de Búsqueda", + "config.emi.ui.show_hover_overlay": "Resaltar Objeto Bajo el Cursor", + "config.emi.ui.append_mod_id": "Mostrar ID del Mod", + "config.emi.ui.append_item_mod_id": "Mostrar ID del Mod en Objeto", + "config.emi.ui.recipe_book_action": "Comportamiento del Libro de Recetas", + "config.emi.ui.search_sidebar_focus": "Foco de Barra de Busqueda", + "config.emi.ui.empty_search_sidebar_focus": "Foco de Barra de Busqueda Vacía", + + "config.emi.tooltip.ui.effect_location": "Determina dónde deben mostrarse los efectos en la interfaz.", + "config.emi.tooltip.ui.center_search_bar": "Determina si la barra de búsqueda está centrada o en el lateral.", + "config.emi.tooltip.ui.show_hover_overlay": "Determina si se muestra un color de resalte en el objeto que está bajo el cursor.", + "config.emi.tooltip.ui.append_mod_id": "Determina si se muestra el nombre del mod en la descripción del objeto.", + "config.emi.tooltip.ui.append_item_mod_id": "Determina si se muestra el nombre del mod en la descripción del objeto, en caso de que otro mod tenga una función similar.", + "config.emi.tooltip.ui.recipe_book_action": "Qué comportamiento debe tener el Libro de Recetas al hacer click sobre él.", + "config.emi.tooltip.ui.search_sidebar_focus": "Qué barra lateral se debe enfocar al seleccionar la barra de búsqueda.", + "config.emi.tooltip.ui.empty_search_sidebar_focus": "Qué barra lateral se debe enfocar al vaciar la barra de búsqueda.", + + "config.emi.ui.left_sidebar_pages": "Páginas", + "config.emi.ui.left_sidebar_subpanels": "Subpaneles", + "config.emi.ui.left_sidebar_size": "Tamaño", + "config.emi.ui.left_sidebar_margins": "Márgenes", + "config.emi.ui.left_sidebar_align": "Alinear", + "config.emi.ui.left_sidebar_header": "Cabecera", + "config.emi.ui.left_sidebar_theme": "Tema", + + "config.emi.tooltip.ui.left_sidebar_pages": "Páginas mostradas en la barra lateral izquierda.", + "config.emi.tooltip.ui.left_sidebar_subpanels": "Subpaneles mostrados en la barra lateral izquierda.", + "config.emi.tooltip.ui.left_sidebar_size": "Tamaño de la barra lateral izquierda.", + "config.emi.tooltip.ui.left_sidebar_margins": "Determina en píxeles cuánto espacio debe haber entre la barra lateral y otros elementos.", + "config.emi.tooltip.ui.left_sidebar_align": "Determina la posición de la barra lateral izquierda.", + "config.emi.tooltip.ui.left_sidebar_header": "Determina si aparecen o no los botones y el contador de páginas en la cabecera de la barra lateral izquierda.", + "config.emi.tooltip.ui.left_sidebar_theme": "Establece el tema a utilizar en la barra lateral izquierda.", + + "config.emi.ui.right_sidebar_pages": "Pages", + "config.emi.ui.right_sidebar_subpanels": "Subpaneles", + "config.emi.ui.right_sidebar_size": "Tamaño", + "config.emi.ui.right_sidebar_margins": "Márgenes", + "config.emi.ui.right_sidebar_align": "Alinear", + "config.emi.ui.right_sidebar_header": "Cabecera", + "config.emi.ui.right_sidebar_theme": "Tema", + + "config.emi.tooltip.ui.right_sidebar_pages": "Páginas mostradas en la barra lateral derecha.", + "config.emi.tooltip.ui.right_sidebar_subpanels": "Subpaneles mostrados en la barra lateral derecha.", + "config.emi.tooltip.ui.right_sidebar_size": "Tamaño de la barra lateral derecha.", + "config.emi.tooltip.ui.right_sidebar_margins": "Determina en píxeles cuánto espacio debe haber entre la barra lateral y otros elementos.", + "config.emi.tooltip.ui.right_sidebar_align": "Determina la posición de la barra lateral derecha.", + "config.emi.tooltip.ui.right_sidebar_header": "Determina si aparecen o no los botones y el contador de páginas en la cabecera de la barra lateral derecha.", + "config.emi.tooltip.ui.right_sidebar_theme": "Establece el tema a utilizar en la barra lateral derecha.", + + "config.emi.ui.top_sidebar_pages": "Pages", + "config.emi.ui.top_sidebar_subpanels": "Subpaneles", + "config.emi.ui.top_sidebar_size": "Tamaño", + "config.emi.ui.top_sidebar_margins": "Márgenes", + "config.emi.ui.top_sidebar_align": "Alinear", + "config.emi.ui.top_sidebar_header": "Cabecera", + "config.emi.ui.top_sidebar_theme": "Tema", + + "config.emi.tooltip.ui.top_sidebar_pages": "Páginas mostradas en la barra superior.", + "config.emi.tooltip.ui.top_sidebar_subpanels": "Subpaneles mostrados en la barra superior.", + "config.emi.tooltip.ui.top_sidebar_size": "Tamaño de la barra superior.", + "config.emi.tooltip.ui.top_sidebar_margins": "Determina en píxeles cuánto espacio debe haber entre la barra superior y otros elementos.", + "config.emi.tooltip.ui.top_sidebar_align": "Determina la posición de la barra superior.", + "config.emi.tooltip.ui.top_sidebar_header": "Determina si aparecen o no los botones y el contador de páginas en la cabecera de la barra inferior.", + "config.emi.tooltip.ui.top_sidebar_theme": "Establece el tema a utilizar en la barra superior.", + + "config.emi.ui.bottom_sidebar_pages": "Pages", + "config.emi.ui.bottom_sidebar_subpanels": "Subpaneles", + "config.emi.ui.bottom_sidebar_size": "Tamaño", + "config.emi.ui.bottom_sidebar_margins": "Márgenes", + "config.emi.ui.bottom_sidebar_align": "Alinear", + "config.emi.ui.bottom_sidebar_header": "Cabecera", + "config.emi.ui.bottom_sidebar_theme": "Tema", + + "config.emi.tooltip.ui.bottom_sidebar_pages": "Páginas mostradas en la barra inferior.", + "config.emi.tooltip.ui.bottom_sidebar_subpanels": "Subpaneles mostrados en la barra inferior.", + "config.emi.tooltip.ui.bottom_sidebar_size": "Tamaño de la barra inferior.", + "config.emi.tooltip.ui.bottom_sidebar_margins": "Determina en píxeles cuánto espacio debe haber entre la barra inferior y otros elementos.", + "config.emi.tooltip.ui.bottom_sidebar_align": "Determina la posición de la barra inferior.", + "config.emi.tooltip.ui.bottom_sidebar_header": "Determina si aparecen o no los botones y el contador de páginas en la cabecera de la barra inferior.", + "config.emi.tooltip.ui.bottom_sidebar_theme": "Establece el tema a utilizar en la barra inferior.", + + "config.emi.ui.maximum_recipe_screen_height": "Altura Máxima", + "config.emi.ui.minimum_recipe_screen_width": "Anchura Mínima", + "config.emi.ui.vertical_margin": "Margen Vertical", + "config.emi.ui.workstation_location": "Ubicación de la Mesa de Trabajo", + "config.emi.ui.miscraft_prevention": "Prevenir fabricación accidental", + "config.emi.ui.fluid_unit": "Unidad de Medida de Fluidos", + "config.emi.ui.show_cost_per_batch": "Mostrar Coste por Lote", + "config.emi.ui.recipe_default_button": "Botón de Receta por Defecto", + "config.emi.ui.recipe_tree_button": "Botón de Árbol de Recetas", + "config.emi.ui.recipe_fill_button": "Botón de Completar Receta", + "config.emi.ui.recipe_screenshot_button": "Botón de Captura de Pantalla", + "config.emi.ui.recipe_screenshot_scale": "Escala de Captura de Pantalla", + "config.emi.ui.use_batched_renderer": "Usar Renderizado por Lotes", + + "config.emi.tooltip.ui.maximum_recipe_screen_height": "Determina en píxeles la altura máxima de la vista de recetas.", + "config.emi.tooltip.ui.minimum_recipe_screen_width": "Determina en píxeles la anchura mínima de la vista de recetas.", + "config.emi.tooltip.ui.vertical_margin": "Determina en píxeles el márgen vertical de la vista de recetas.", + "config.emi.tooltip.ui.workstation_location": "Establece la ubicación del banco de trabajo.", + "config.emi.tooltip.ui.miscraft_prevention": "Previene fabricaciones accidentales al mantener pulado shift y mover el cursor.", + "config.emi.tooltip.ui.show_cost_per_batch": "Muestra el coste total de fabricación por lote al poner el cursor sobre una receta.", + "config.emi.tooltip.ui.fluid_unit": "Determina la unidad a usar para mostrar las cantidades de fluidos.", + "config.emi.tooltip.ui.recipe_default_button": "Determina si las recetas tienen un botón para establecerlas por defecto.", + "config.emi.tooltip.ui.recipe_tree_button": "Determina si las recetas tienen un botón para mostrar su árbol de recetas.", + "config.emi.tooltip.ui.recipe_fill_button": "Determina si las recetas tienen un botón para completar los objetos faltantes para fabricarla.", + "config.emi.tooltip.ui.recipe_screenshot_button": "Determina si las recetas tienen un botón para tomar una captura de pantalla de la receta.", + "config.emi.tooltip.ui.recipe_screenshot_scale": "Determina la escala de la interfaz con la que se toman las capturas de pantalla de recetas.", + "config.emi.tooltip.ui.use_batched_renderer": "Establece si se usa el renderizado por lotes. Es más rápido, pero puede tener incompatibilidades con shaders o algunos mods.", + + "config.emi.dev.dev_mode": "Modo Desarrollador", + "config.emi.dev.edit_mode": "Modo Edición", + "config.emi.dev.log_untranslated_tags": "Registrar Etiquetas sin Traducir", + "config.emi.dev.log_non_tag_ingredients": "Registrar Ingredientes sin Etiqueta", + "config.emi.dev.show_recipe_ids": "Mostrar IDs de Recetas", + "config.emi.dev.show_recipe_decorators": "Mostrar Extras de Recetas", + "config.emi.dev.highlight_defaulted": "Resaltar stacks con receta por Defecto", + "config.emi.dev.highlight_exclusion_areas": "Resaltar Zonas de Exclusión", + + "config.emi.tooltip.dev.dev_mode": "Determina si las funciones de desarrollador están activas. No recomendado para jugar normalmente.", + "config.emi.tooltip.dev.edit_mode": "Establece si la edición del índice está permitida.", + "config.emi.tooltip.dev.log_untranslated_tags": "Determina si las etiquetas sin traducir deben registrarse como avisos en el log.", + "config.emi.tooltip.dev.log_non_tag_ingredients": "Determina si los ingredientes sin etiqueta deben registrarse como avisos en el log.", + "config.emi.tooltip.dev.show_recipe_ids": "Determina si se debe mostrar el ID de una receta al poner el cursor sobre su resultado.", + "config.emi.tooltip.dev.show_recipe_decorators": "Determina si en las recetas deben mostrarse widgets o ventanas adicionales añadidos por otros mods. Suelen ser útiles para desarrolladores y por compatibilidad, no para jugar normalmente.", + "config.emi.tooltip.dev.highlight_defaulted": "Determina si los objetos del índice deben estar resaltados en caso de que exista una receta por defecto para ellos.", + "config.emi.tooltip.dev.highlight_exclusion_areas": "Determina si se debe resaltar las zonas de exclusión.", + + "config.emi.presets.sidebars": "Barras Laterales", + "config.emi.presets.binds": "Asignaciones", + "config.emi.presets.restore": "Restablecer", + + "config.emi.presets.productive": "Productivo", + "config.emi.presets.recipe_book_plus": "Libro de Recetas Plus", + "config.emi.presets.empty_search_craftable": "Fabricables con Búsqueda Vacía", + + "config.emi.presets.author_binds": "Asignaciones de Autor", + + "config.emi.presets.backup": "Restablecer Backup", + "config.emi.presets.defaults": "Restablecer por Defecto", + + "emi.unit.liters": "Litros", + "emi.unit.millibuckets": "Millibuckets", + "emi.unit.droplets": "Droplets (Gotas)", + "emi.fluid.amount.liters": "%s L", + "emi.fluid.amount.millibuckets": "%smB", + "emi.fluid.amount.droplets": "%s d", + + "emi.disabled": "EMI desactivado! Actívalo con", + "emi.reloading": "Reiniciando EMI...", + "emi.reloading.waiting": "EMI esperando datos de recetas del servidor...", + "emi.reloading.error": "§cEMI ha sufrido una excepción crítica al reiniciar, revise el log", + "emi.reloading.worry": "§cExperimentando demora, está todo bien?", + "emi.reloading.still_baking_recipes": "§dCompilando recetas...", + "emi.search": "Buscar en EMI...", + "emi.search_config": "Buscar en config...", + "emi.delete_stack": "§cBorrar stack seleccionado", + "emi.inapplicable": "La estación de trabajo actual no soporta la receta", + "emi.not_enough_ingredients": "Faltan ingredientes para fabricar", + "emi.too_small": "La cuadrícula de fabricación es demasiado pequeña para fabricar", + "emi.favorite_recipe": "Pulsa %s para añadir la receta a favoritos", + "emi.resolve.resolve": "Pulsa %s para usar en éste árbol de recetas", + "emi.resolve.default": "Pulsa %s para establecer por defecto para todos los árboles", + "emi.page": "Página %s de %s", + "emi.page.short": "%s/%s", + "emi.total_cost": "Coste Total", + "emi.cost_per": "Coste por lote:", + "emi.leftovers": "Sobrante", + "emi.view_all_recipes": "Haz click para ver todas las recetas", + "emi.tree_welcome": "Bienvenido a %s", + "emi.no_tree": "Aún no has seleccionado un árbol de recetas para mostrar...", + "emi.random_tree": "Tal vez querrías ver uno aleatorio?", + "emi.random_tree_input": "Pulsa §6[ctrl + r]", + "emi.edit_mode.hide_one": "Pulsa %s para ocultar el stack", + "emi.edit_mode.hide_all": "Pulsa %s para ocultar stacks por ID", + "tooltip.emi.chance.consume": "Probabilidad de consumir: %s%%", + "tooltip.emi.chance.produce": "Probabilidad de producir: %s%%", + "tooltip.emi.accepts": "Admite:", + "tooltip.emi.fill_recipe": "Completar Receta", + "tooltip.emi.fill_recipe_no_server": "Imposible completar receta sin EMI en el servidor", + "tooltip.emi.set_default": "Establecer receta por defecto", + "tooltip.emi.current_defaults": "Actualmente es la receta por defecto para:", + "tooltip.emi.unset_default": "Eliminar receta por defecto", + "tooltip.emi.set_default_stack": "Pulsa %s on an output to set default recipe for that stack", + "tooltip.emi.view_tree": "Ver Árbol de Recetas", + "tooltip.emi.recipe_screenshot": "Captura de Pantalla de Receta", + "tooltip.emi.resolution": "Resolviendo árbol de recetas para ingrediente", + "tooltip.emi.select_resolution": "Haz click en el §6resultado de receta§r para asignarlo a §déste§r árbol de recetas", + "tooltip.emi.default_resolution": "Haz click en el §6botón de receta por defecto§r para asignarla a §atodos§r los árboles de recetas", + "tooltip.emi.clear_resolution": "Haz click §6aquí§r para borrar el resultado", + + "tooltip.emi.config": "Opciones de %s", + "tooltip.emi.recipe_tree": "Árbol de Recetas", + + "tooltip.emi.config.global": "Alterna el uso de una configuración global de EMI para todas las instancias de juego en lugar de una configuración local por instancia.", + + "tooltip.emi.synfav.uncraftable": "Imposible fabricar §cningún§r lote", + "tooltip.emi.synfav.partially_craftable": "Se pueden fabricar §dalgunos§r lotes", + "tooltip.emi.synfav.fully_craftable": "Se pueden fabricar §a%s§r lotes", + "tooltip.emi.synfav.craft_some": "Pulsa %s para fabricar tantos como sea posible", + "tooltip.emi.synfav.craft_all": "Pulsa %s para fabricar §9%s§r lotes", + + "tooltip.emi.bom.batch_size": "Tamaño del lote: %s\nDesplaza la rueda para ajustar\nMantén §6[shift]§r para ajustar en 16", + "tooltip.emi.bom.batch_size.ideal": "Pulsa %s para obtener las mínimas sobras posibles", + "tooltip.emi.bom.mode.view": "§6Mostrando§r árbol de recetas", + "tooltip.emi.bom.mode.craft": "§6Fabricando§r árbol de recetas\nEl progreso se mostrará en el árbol de recetas\n§bFavoritos sintéticos§r añadidos a la barra lateral", + "tooltip.emi.bom.help": "El árbol de recetas muestra la progresión y el coste total de la receta.\nLa vista se puede mover y ampliar.\n\nClick izquierdo en un nodo para seleccionar una receta y asignarla.\nMantén §6[shift]§r para seleccionar automáticamente en función de tu inventario.\n\nClick derecho en un nodo de la receta para plegarlo temporalmente\nMantén §6[shift]§r para vaciar la receta.\n\nEl estado inicial del árbol es controlado por las recetas por defecto.\nUn botón junto a las recetas puede establecer las preferencias por defecto.\n\nEl ajuste por coste total puede usarse para ayudar a crear un árbol.\nMientras esté fabricando, se mostrarán los materiales que hace falta recoger.\nSe añadirán §bFavoritos sintéticos§r a la barra lateral que\nmostrarán los pasos incompletos y podrán usarse para fabricar.", + + "tooltip.emi.fluid_interaction.basalt.soul_soil": "Debajo de lava", + "tooltip.emi.fluid_interaction.basalt.blue_ice": "Junto a lava", + + "screen.emi.recipe": "Receta", + "screen.emi.config": "Opciones", + "screen.emi.presets": "Ajustes Predefinidos", + + "screen.emi.config.reset": "Revertir %s cambio(s)", + + "emi.error.recipe.initialize": "Error inicializando", + "emi.error.recipe.render": "Error Renderizando", + + "emi.dev.severity.error": "Error", + "emi.dev.severity.warning": "Aviso", + "emi.dev.null_recipe_id": "El ID de receta es §7nulo§r\nLas recetas deben tener un ID único para poder serializarlas\nÉsto solo afectará a ésta receta", + "emi.dev.duplicate_recipe_id": "El ID de receta es un duplicado de otra receta\n§7%s§r\nLas recetas deben tener un ID único para poder serializarlas\nÉsto romperá otras recetas con éste ID", + "emi.dev.duplicate_vanilla_recipe_id": "El ID de receta es un duplicado de una receta vanilla\n§7%s§r\nLas recetas deben tener un ID único para poder serializarlas\nÉsto romperá la receta vanilla con el mismo ID", + "emi.dev.synthetic_id": "Usa un ID sintético §7[namespace]§b:/§7[path]§r", + "emi.dev.suggest_id": "Usa un ID sintético §7[namespace]§b:/§7[path]§r como\n§7%s§b:/§7%s§r", + "emi.dev.null_input_or_output": "Las entradas o resultados de la receta son §7nulos§r\nUsa una lista vacía si no quieres entradas o resultados\nUsa §7EmiStack.EMPTY§r para representar un stack vacío", + "emi.dev.no_output_slots": "Las ranuras de la receta no incluyen ningún resultado\nLlama a §7SlotWidget.recipeContext(this)§r en los resultados§r", + + "emi.chess.piece.white_pawn": "Peón Blanco", + "emi.chess.piece.white_rook": "Torre Blanca", + "emi.chess.piece.white_knight": "Caballo Blanco", + "emi.chess.piece.white_bishop": "Alfil Blanco", + "emi.chess.piece.white_queen": "Reina Blanca", + "emi.chess.piece.white_king": "Rey Blanco", + "emi.chess.piece.black_pawn": "Peón Negro", + "emi.chess.piece.black_rook": "Torre Negra", + "emi.chess.piece.black_knight": "Caballo Negro", + "emi.chess.piece.black_bishop": "Alfil Negro", + "emi.chess.piece.black_queen": "Reina Negra", + "emi.chess.piece.black_king": "Rey Negro", + "emi.chess.tooltip.invite": "Invita al jugador con la barra de búsqueda para jugar al ajedrez", + "emi.chess.tooltip.accept": "Aceptar la invitación de %s", + "emi.chess.tooltip.decline": "Click derecho para rechazar la invitación de %s", + "emi.chess.tooltip.restart": "Click derecho para reiniciar", + "emi.chess.multiplayer.invited": "%s te ha invitado a jugar al ajedrez", + "emi.chess.multiplayer.accepted": "%s aceptó tu invitación", + "emi.chess.multiplayer.cancelled": "%s canceló la partida de ajedrez", + "emi.chess.multiplayer.unavailable": "%s no puede jugar al ajedrez", + + "emi.cooking.experience": "%s XP", + "emi.cooking.time": "%s Segundos", + "emi.grinding.experience": "%s - %s XP", + "emi.fuel_time.items": "Funde %s objeto(s)", + + "emi.category.minecraft.crafting": "Fabricación", + "emi.category.minecraft.smelting": "Fundición", + "emi.category.minecraft.blasting": "Fundición", + "emi.category.minecraft.smoking": "Ahumado", + "emi.category.minecraft.campfire_cooking": "Cocina en hoguera", + "emi.category.minecraft.stonecutting": "Cortapiedras", + "emi.category.minecraft.smithing": "Herrería", + "emi.category.emi.anvil_repairing": "Reparación con yunque", + "emi.category.minecraft.brewing": "Fabricación de Pociones", + "emi.category.emi.grinding": "Afilado", + "emi.category.emi.world_interaction": "Interacción con el Mundo", + "emi.category.emi.fuel": "Combustible", + "emi.category.emi.composting": "Compostaje", + "emi.category.emi.info": "Información", + + "emi.category.emi.tag": "Etiquetas", + "emi.category.emi.ingredient": "Ingredientes", + + "alias.emi.workbench": "Mesa de trabajo", + + "tag.item.minecraft.logs": "Troncos", + "tag.item.minecraft.oak_logs": "Troncos de Roble", + "tag.item.minecraft.birch_logs": "Troncos de Abedul", + "tag.item.minecraft.spruce_logs": "Troncos de Abeto", + "tag.item.minecraft.jungle_logs": "Troncos de la Jungla", + "tag.item.minecraft.dark_oak_logs": "Troncos de Roble Oscuro", + "tag.item.minecraft.crimson_stems": "Tallos Carmesí", + "tag.item.minecraft.warped_stems": "Tallos Deformados", + "tag.item.minecraft.acacia_logs": "Troncos de Acacia", + "tag.item.minecraft.logs_that_burn": "Troncos Quemables", + "tag.item.minecraft.planks": "Tablones", + "tag.item.minecraft.non_flammable_wood": "Madera No Inflamable", + "tag.item.minecraft.coal_ores": "Menas de Carbón", + "tag.item.minecraft.copper_ores": "Menas de Cobre", + "tag.item.minecraft.diamond_ores": "Menas de Diamante", + "tag.item.minecraft.emerald_ores": "Menas de Esmeralda", + "tag.item.minecraft.gold_ores": "Menas de Oro", + "tag.item.minecraft.iron_ores": "Menas de Hierro", + "tag.item.minecraft.lapis_ores": "Menas de Lapislázuli", + "tag.item.minecraft.redstone_ores": "Menas de Redstone", + "tag.item.minecraft.anvil": "Yunques", + "tag.item.minecraft.arrows": "Flechas", + "tag.item.minecraft.axolotl_tempt_items": "Objetos Para Atraer Ajolotes", + "tag.item.minecraft.banners": "Estandartes", + "tag.item.minecraft.beacon_payment_items": "Activadores de Faros", + "tag.item.minecraft.beds": "Camas", + "tag.item.minecraft.boats": "Barcos", + "tag.item.minecraft.buttons": "Botones", + "tag.item.minecraft.candles": "Velas", + "tag.item.minecraft.carpets": "Alfombras", + "tag.item.minecraft.coals": "Carbones", + "tag.item.minecraft.creeper_drop_music_discs": "Discos de Música de Creepers", + "tag.item.minecraft.creeper_igniters": "Creeper Igniters", + "tag.item.minecraft.dirt": "Tierra", + "tag.item.minecraft.doors": "Puertas", + "tag.item.minecraft.fences": "Vallas", + "tag.item.minecraft.fence_gates": "Puertas de Valla", + "tag.item.minecraft.fishes": "Peces", + "tag.item.minecraft.flowers": "Flores", + "tag.item.minecraft.fox_food": "Comida de Zorro", + "tag.item.minecraft.freeze_immune_wearables": "Equipo Inmune al Frío", + "tag.item.minecraft.ignored_by_piglin_babies": "Ignorado por Piglins Bebé", + "tag.item.minecraft.leaves": "Hojas", + "tag.item.minecraft.lectern_books": "Libros de Atril", + "tag.item.minecraft.music_discs": "Discos de Música", + "tag.item.minecraft.occludes_vibration_signals": "Bloquea Señales de Vibración", + "tag.item.minecraft.piglin_food": "Comida de Piglin", + "tag.item.minecraft.piglin_loved": "Amado por Piglins", + "tag.item.minecraft.piglin_repellents": "Repelente de Piglins", + "tag.item.minecraft.rails": "Raíles", + "tag.item.minecraft.sand": "Arena", + "tag.item.minecraft.saplings": "Brotes", + "tag.item.minecraft.signs": "Carteles", + "tag.item.minecraft.slabs": "Losas", + "tag.item.minecraft.small_flowers": "Flores Pequeñas", + "tag.item.minecraft.soul_fire_base_blocks": "Bloques Base de Fuego de Alma", + "tag.item.minecraft.stairs": "Escaleras", + "tag.item.minecraft.stone_bricks": "Ladrillos de Piedra", + "tag.item.minecraft.stone_crafting_materials": "Materiales de Fabricación de Piedra", + "tag.item.minecraft.stone_tool_materials": "Materiales de Herramientas de Piedra", + "tag.item.minecraft.tall_flowers": "Flores Altas", + "tag.item.minecraft.terracotta": "Terracota", + "tag.item.minecraft.trapdoors": "Trampillas", + "tag.item.minecraft.walls": "Paredes", + "tag.item.minecraft.wooden_buttons": "Botones de Madera", + "tag.item.minecraft.wooden_doors": "Puertas de Madera", + "tag.item.minecraft.wooden_fences": "Vallas de Madera", + "tag.item.minecraft.wooden_pressure_plates": "Placas de Presión de Madera", + "tag.item.minecraft.wooden_slabs": "Losas de Madera", + "tag.item.minecraft.wooden_stairs": "Escaleras de Madera", + "tag.item.minecraft.wooden_trapdoors": "Trampillas de Madera", + "tag.item.minecraft.wool": "Lana", + "tag.item.minecraft.wart_blocks": "Bloques de verruga del inframundo", + "tag.item.minecraft.wool_carpets": "Wool Carpets", + "tag.item.minecraft.mangrove_logs": "Troncos de mangle", + "tag.item.minecraft.compasses": "Brújulas", + "tag.item.minecraft.chest_boats": "Barcos con cofre", + "tag.item.minecraft.overworld_natural_logs": "Troncos Naturales de la Superficie", + "tag.item.minecraft.axes": "Hachas", + "tag.item.minecraft.hoes": "Azadas", + "tag.item.minecraft.pickaxes": "Picos", + "tag.item.minecraft.shovels": "Palas", + "tag.item.minecraft.smelts_to_glass": "Se Funde para Cristal", + "tag.item.minecraft.swords": "Espadas", + "tag.item.minecraft.tools": "Herramientas", + "tag.item.minecraft.bamboo_blocks": "Bloques de Bambú", + "tag.item.minecraft.bookshelf_books": "Libros de Estantería", + "tag.item.minecraft.breaks_decorated_pots": "Rompe Macetas Decorativas", + "tag.item.minecraft.cherry_logs": "Troncos de Cerezo", + "tag.item.minecraft.decorated_pot_ingredients": "Ingredientes de Maceta Decorativa", + "tag.item.minecraft.decorated_pot_sherds": "Frascos Decorados", + "tag.item.minecraft.hanging_signs": "Carteles Colgantes", + "tag.item.minecraft.noteblock_top_instruments": "Instrumentos Sobre Bloque de Notas", + "tag.item.minecraft.sniffer_food": "Comida de Sniffer", + "tag.item.minecraft.stone_buttons": "Botones de Piedra", + "tag.item.minecraft.trim_materials": "Materiales de Modificación", + "tag.item.minecraft.trim_templates": "Plantillas de Herrería", + "tag.item.minecraft.trimmable_armor": "Armadura modificable", + "tag.item.minecraft.villager_plantable_seeds": "Semillas Plantables por Aldeanos", + + "tag.minecraft.armadillo_food": "Comida de Armadillo", + "tag.minecraft.axolotl_food": "Comida de Ajolote", + "tag.minecraft.bee_food": "Comida de Abeja", + "tag.minecraft.camel_food": "Comida de Camello", + "tag.minecraft.cat_food": "Comida de Gato", + "tag.minecraft.chest_armor": "Armadura de Pecho", + "tag.minecraft.chicken_food": "Comida de Gallina", + "tag.minecraft.cow_food": "Comida de Vaca", + "tag.minecraft.dyeable": "Teñible", + "tag.minecraft.enchantable.armor": "Armadura Encantable", + "tag.minecraft.enchantable.bow": "Arcos Encantables", + "tag.minecraft.enchantable.chest_armor": "Armadura de Pecho Encantable", + "tag.minecraft.enchantable.crossbow": "Ballestas Encantables", + "tag.minecraft.enchantable.durability": "Durabilidad Encantable", + "tag.minecraft.enchantable.equippable": "Equipamiento Encantable", + "tag.minecraft.enchantable.fire_aspect": "Encantable con Aspecto Ígneo", + "tag.minecraft.enchantable.fishing": "Encantable con Pesca", + "tag.minecraft.enchantable.foot_armor": "Armadura de Pies Encantable", + "tag.minecraft.enchantable.head_armor": "Armadura de Cabeza Encantable", + "tag.minecraft.enchantable.leg_armor": "Armadura de Piernas Encantable", + "tag.minecraft.enchantable.mace": "Maza Encantable", + "tag.minecraft.enchantable.mining": "Encantable con Minería", + "tag.minecraft.enchantable.mining_loot": "Encantable con Fortuna", + "tag.minecraft.enchantable.sharp_weapon": "Armas Afiladas Encantables", + "tag.minecraft.enchantable.sword": "Espadas Encantables", + "tag.minecraft.enchantable.trident": "Tridentes Encantables", + "tag.minecraft.enchantable.vanishing": "Encantable con Desvanecimiento", + "tag.minecraft.enchantable.weapon": "Armas Encantables", + "tag.minecraft.foot_armor": "Armadura de Pies", + "tag.minecraft.frog_food": "Comida de Rana", + "tag.minecraft.goat_food": "Comida de Cabra", + "tag.minecraft.head_armor": "Armadura de Cabeza", + "tag.minecraft.hoglin_food": "Comida de Hoglin", + "tag.minecraft.horse_food": "Comida de Caballo", + "tag.minecraft.horse_tempt_items": "Objetos para Atraer Caballos", + "tag.minecraft.leg_armor": "Armadura de Piernas", + "tag.minecraft.llama_food": "Comida de Llama", + "tag.minecraft.llama_tempt_items": "Objetos para Atraer Llamas", + "tag.minecraft.meat": "Carne", + "tag.minecraft.ocelot_food": "Comida de Ocelote", + "tag.minecraft.panda_food": "Comida de Panda", + "tag.minecraft.parrot_food": "Comida de Loro", + "tag.minecraft.parrot_poisonous_food": "Comida Venenosa para Loros", + "tag.minecraft.pig_food": "Comida de Cerdo", + "tag.minecraft.rabbit_food": "Comida de Conejo", + "tag.minecraft.sheep_food": "Comida de Oveja", + "tag.minecraft.skulls": "Calaveras", + "tag.minecraft.strider_food": "Comida de Lavagante", + "tag.minecraft.strider_tempt_items": "Objetos para Atraer Lavagantes", + "tag.minecraft.turtle_food": "Comida de Tortuga", + "tag.minecraft.wolf_food": "Comida de Lobo", + + "tag.fluid.minecraft.water": "Agua", + "tag.fluid.minecraft.lava": "Lava", + "tag.fluid.c.water": "Agua", + "tag.fluid.c.lava": "Lava", + "tag.fluid.c.milk": "Leche", + + "tag.item.c.stone": "Piedra", + "tag.item.c.cobblestone": "Roca", + "tag.item.c.cobblestone.deepslate": "Pizarra profunda rocosa", + "tag.item.c.cobblestone.infested": "Roca Infestada", + "tag.item.c.cobblestone.mossy": "Roca Musgosa", + "tag.item.c.cobblestone.normal": "Roca", + "tag.item.c.sandstone": "Arenisca", + "tag.item.c.glass_blocks": "Bloques de Cristal", + "tag.item.c.stained_glass": "Cristal Tintado", + "tag.item.c.stained_glass_panes": "Paneles de Cristal Tintado", + "tag.item.c.glass": "Cristal", + "tag.item.c.glass.colorless": "Cristal Incoloro", + "tag.item.c.glass.silica": "Cristal de Sílice", + "tag.item.c.quartz_blocks": "Bloques de Cuarzo", + "tag.item.c.glass_panes": "Paneles de Cristal", + "tag.item.c.glass.tinted": "Cristal Tintado", + "tag.item.c.glass_panes.colorless": "Paneles de Cristal Incoloro", + "tag.item.c.raw_materials": "Materiales en Bruto", + "tag.item.c.rods": "Varas", + "tag.item.c.ores": "Menas", + "tag.item.c.nuggets": "Pepitas", + "tag.item.c.ingots": "Lingotes", + "tag.item.c.gems": "Gemas", + "tag.item.c.plates": "Placas", + "tag.item.c.dusts": "Polvos", + "tag.item.c.storage_blocks": "Bloques de Almacenamiento", + "tag.item.c.seeds": "Semillas", + "tag.item.c.crops": "Cultivos", + "tag.item.c.heads": "Cabezas", + "tag.item.c.dyes": "Tintes", + "tag.item.c.mushrooms": "Champiñones", + "tag.item.c.fence_gates": "Puertas de Valla", + "tag.item.c.fence_gates.wooden": "Puertas de Valla de Madera", + "tag.item.c.chests": "Cofres", + "tag.item.c.wooden_chests": "Cofres de Madera", + "tag.item.c.ores_in_ground.stone": "Menas de Piedra", + "tag.item.c.ores_in_ground.deepslate": "Menas de Pizarra Profunda", + "tag.item.c.ores_in_ground.netherrack": "Menas de Netherrack", + + "tag.item.c.chest": "Cofres", + "tag.item.c.coal": "Carbones", + "tag.item.c.sand": "Arenas", + "tag.item.c.glass_pane": "Paneles de Cristal", + "tag.item.c.beacon_payment": "Activadores de Faros", + "tag.item.c.fences": "Vallas", + "tag.item.c.fences.wooden": "Vallas de Madera", + "tag.item.c.ores.coal": "Menas de Carbón", + "tag.item.c.ores.copper": "Menas de Cobre", + "tag.item.c.ores.iron": "Menas de Hierro", + "tag.item.c.ores.gold": "Menas de Oro", + "tag.item.c.ores.redstone": "Menas de Redstone", + "tag.item.c.ores.lapis": "Mensa de Lapislázuli", + "tag.item.c.ores.emerald": "Menas de Esmeralda", + "tag.item.c.ores.diamond": "Menas de Diamante", + + "tag.item.c.storage_blocks.coal": "Bloques de Almacenamiento de Carbón", + + "tag.item.c.raw_materials.copper": "Cobre en Bruto", + "tag.item.c.copper_dusts": "Polvos de Cobre", + "tag.item.c.dusts.copper": "Polvos de Cobre", + "tag.item.c.copper_ingots": "Lingotes de Cobre", + "tag.item.c.ingots.copper": "Lingotes de Cobre", + "tag.item.c.copper_nuggets": "Pepitas de Cobre", + "tag.item.c.nuggets.copper": "Pepitas de Cobre", + "tag.item.c.plates.copper": "Placas de Cobre", + "tag.item.c.raw_copper_ores": "Menas de Cobre en Bruto", + "tag.item.c.raw_copper_blocks": "Bloques de Cobre en Bruto", + "tag.item.c.copper_blocks": "Bloques de Cobre", + "tag.item.c.storage_blocks.raw_copper": "Bloques de Almacenamiento de Cobre en Bruto", + "tag.item.c.storage_blocks.copper": "Bloques de Almacenamiento de Cobre", + + "tag.item.c.raw_materials.iron": "Hierro en Bruto", + "tag.item.c.iron_dusts": "Polvos de Hierro", + "tag.item.c.dusts.iron": "Polvos de Hierro", + "tag.item.c.iron_ingots": "Lingotes de Hierro", + "tag.item.c.ingots.iron": "Lingotes de Hierro", + "tag.item.c.iron_nuggets": "Pepitas de Hierro", + "tag.item.c.nuggets.iron": "Pepitas de Hierro", + "tag.item.c.plates.iron": "Placas de Hierro", + "tag.item.c.raw_iron_ores": "Menas de Hierro en Bruto", + "tag.item.c.raw_iron_blocks": "Bloques de Hierro en Bruto", + "tag.item.c.iron_blocks": "Bloques de Hierro", + "tag.item.c.storage_blocks.raw_iron": "Bloques de Almacenamiento de Hierro en Bruto", + "tag.item.c.storage_blocks.iron": "Bloques de Almacenamiento de Hierro", + + "tag.item.c.raw_materials.gold": "Oro en Bruto", + "tag.item.c.gold_dusts": "Polvos de Oro", + "tag.item.c.dusts.gold": "Polvos de Oro", + "tag.item.c.gold_ingots": "Lingotes de Oro", + "tag.item.c.ingots.gold": "Lingotes de Oro", + "tag.item.c.gold_nuggets": "Pepitas de Oro", + "tag.item.c.nuggets.gold": "Pepitas de Oro", + "tag.item.c.plates.gold": "Placas de Oro", + "tag.item.c.raw_gold_ores": "Menas de Oro en Bruto", + "tag.item.c.raw_gold_blocks": "Bloques de Oro en Bruto", + "tag.item.c.gold_blocks": "Bloques de Oro", + "tag.item.c.storage_blocks.raw_gold": "Bloques de Almacenamiento de Oro en Bruto", + "tag.item.c.storage_blocks.gold": "Bloques de Almacenamiento de Oro", + + "tag.item.c.gems.amethyst": "Amatistas", + "tag.item.c.amethyst_dusts": "Polvos de Amatista", + "tag.item.c.storage_blocks.amethyst": "Bloques de Almacenamiento de Amatista", + + "tag.item.c.storage_blocks.diamond": "Bloques de Almacenamiento de Diamante", + "tag.item.c.storage_blocks.emerald": "Bloques de Almacenamiento de Esmeralda", + "tag.item.c.storage_blocks.lapis": "Bloques de Almacenamiento de Lapislázuli", + "tag.item.c.storage_blocks.netherite": "Bloques de Almacenamiento de Netherita", + "tag.item.c.storage_blocks.quartz": "Bloques de Almacenamiento de Cuarzo", + "tag.item.c.storage_blocks.redstone": "Bloques de Almacenamiento de Redstone", + "tag.item.c.redstone_dusts": "Polvos de Redstone", + "tag.item.c.redstone_ores": "Menas de Redstone", + "tag.item.c.quartz": "Cuarzo", + "tag.item.c.quartz_ores": "Menas de Cuarzo", + "tag.item.c.diamond_dusts": "Polvos de Diamante", + "tag.item.c.diamonds": "Diamantes", + "tag.item.c.dusts.glowstone": "Polvos de Glowstone", + "tag.item.c.dusts.prismarine": "Polvos de Prismarina", + "tag.item.c.dusts.redstone": "Polvos de Redstone", + "tag.item.c.emeralds": "Esmeraldas", + "tag.item.c.ender_pearl_dusts": "Polvos de Perla de Ender", + "tag.item.c.ender_pearls": "Perlas de Ender", + "tag.item.c.gems.diamond": "Diamantes", + "tag.item.c.gems.emerald": "Esmeraldas", + "tag.item.c.gems.lapis": "Lapislázuli", + "tag.item.c.gems.prismarine": "Prismarina", + "tag.item.c.gems.quartz": "Cuarzo", + "tag.item.c.ingots.brick": "Ladrillos", + "tag.item.c.ingots.nether_brick": "Ladrillos del Nether", + "tag.item.c.ingots.netherite": "Lingotes de Netherita", + "tag.item.c.lapis": "Lapislázuli", + "tag.item.c.nether_quartz_dusts": "Polvos de Cuarzo del Nether", + "tag.item.c.netherite_ingots": "Lingotes de Netherita", + "tag.item.c.netherite_scrap_dusts": "Polvos de Fragmento de Netherita", + "tag.item.c.ores.netherite_scrap": "Menas de Fragmento de Netherita", + "tag.item.c.ores.quartz": "Menas de Cuarzo", + + "tag.item.c.spears": "Lanzas", + "tag.item.c.axes": "Hachas", + "tag.item.c.barrels": "Barriles", + "tag.item.c.barrels.wooden": "Barriles de Madera", + "tag.item.c.white_dyes": "Tintes Blancos", + "tag.item.c.orange_dyes": "Tintes Naranja", + "tag.item.c.magenta_dyes": "Tintes Magenta", + "tag.item.c.light_blue_dyes": "Tintes Azul Claro", + "tag.item.c.yellow_dyes": "Tintes Amarillos", + "tag.item.c.lime_dyes": "Tintes Lima", + "tag.item.c.pink_dyes": "Tintes Rosas", + "tag.item.c.gray_dyes": "Tintes Grises", + "tag.item.c.light_gray_dyes": "Tintes Gris Claro", + "tag.item.c.cyan_dyes": "Tintes Cian", + "tag.item.c.purple_dyes": "Tintes Morados", + "tag.item.c.blue_dyes": "Tintes Azules", + "tag.item.c.brown_dyes": "Tintes Marrones", + "tag.item.c.green_dyes": "Tintes Verdes", + "tag.item.c.red_dyes": "Tintes Rojos", + "tag.item.c.black_dyes": "tintes Negros", + "tag.item.c.dyes.white": "Tintes Blancos", + "tag.item.c.dyes.orange": "Tintes Naranja", + "tag.item.c.dyes.magenta": "Tintes Magenta", + "tag.item.c.dyes.light_blue": "Tintes Azul Claro", + "tag.item.c.dyes.yellow": "Tintes Amarillos", + "tag.item.c.dyes.lime": "Tintes Lima", + "tag.item.c.dyes.pink": "Tintes Rosas", + "tag.item.c.dyes.gray": "Tintes Grises", + "tag.item.c.dyes.light_gray": "Tintes Gris Claro", + "tag.item.c.dyes.cyan": "Tintes Cian", + "tag.item.c.dyes.purple": "Tintes Morados", + "tag.item.c.dyes.blue": "Tintes Azules", + "tag.item.c.dyes.brown": "Tintes Marrones", + "tag.item.c.dyes.green": "Tintes Verdes", + "tag.item.c.dyes.red": "Tintes Rojos", + "tag.item.c.dyes.black": "Tintes Negros", + "tag.item.c.glass.white": "Cristal Blanco", + "tag.item.c.glass.orange": "Cristal Naranja", + "tag.item.c.glass.magenta": "Cristal Magenta", + "tag.item.c.glass.light_blue": "Cristal Azul Claro", + "tag.item.c.glass.yellow": "Cristal Amarillo", + "tag.item.c.glass.lime": "Cristal Lima", + "tag.item.c.glass.pink": "Cristal Rosa", + "tag.item.c.glass.gray": "Cristal Gris", + "tag.item.c.glass.light_gray": "Cristal Gris Claro", + "tag.item.c.glass.cyan": "Cristal Cian", + "tag.item.c.glass.purple": "Cristal Morado", + "tag.item.c.glass.blue": "Cristal Azul", + "tag.item.c.glass.brown": "Cristal Marrón", + "tag.item.c.glass.green": "Cristal Verde", + "tag.item.c.glass.red": "Cristal Rojo", + "tag.item.c.glass.black": "Cristal Negro", + "tag.item.c.glass_panes.white": "Paneles de Cristal Blancos", + "tag.item.c.glass_panes.orange": "Paneles de Cristal Naranjas", + "tag.item.c.glass_panes.magenta": "Paneles de Cristal Magentas", + "tag.item.c.glass_panes.light_blue": "Paneles de Cristal Azul Claro", + "tag.item.c.glass_panes.yellow": "Paneles de Cristal Amarillos", + "tag.item.c.glass_panes.lime": "Paneles de Cristal Lima", + "tag.item.c.glass_panes.pink": "Paneles de Cristal Rosas", + "tag.item.c.glass_panes.gray": "Paneles de Cristal Grises", + "tag.item.c.glass_panes.light_gray": "Paneles de Cristal Gris Claro", + "tag.item.c.glass_panes.cyan": "Paneles de Cristal Cian", + "tag.item.c.glass_panes.purple": "Paneles de Cristal Morados", + "tag.item.c.glass_panes.blue": "Paneles de Cristal Azules", + "tag.item.c.glass_panes.brown": "Paneles de Cristal Marrones", + "tag.item.c.glass_panes.green": "Paneles de Cristal Verdes", + "tag.item.c.glass_panes.red": "Paneles de Cristal Rojos", + "tag.item.c.glass_panes.black": "Paneles de Cristal Negros", + "tag.item.c.bones": "Huesos", + "tag.item.c.bookshelves": "Estanterías", + "tag.item.c.bows": "Arcos", + "tag.item.c.buckets.honey": "Cubos de Miel", + "tag.item.c.chests.ender": "Cofres de Ender", + "tag.item.c.chests.trapped": "Cofres Trampa", + "tag.item.c.chests.wooden": "Cofres de Madera", + "tag.item.c.circuits": "Circuitos", + "tag.item.c.crops.beetroot": "Remolachas", + "tag.item.c.crops.carrot": "Zanahorias", + "tag.item.c.crops.nether_wart": "Verrugas del Nether", + "tag.item.c.crops.potato": "Patatas", + "tag.item.c.crops.wheat": "Trigo", + "tag.item.c.eggs": "Huevos", + "tag.item.c.empty_buckets": "Cubos Vacíos", + "tag.item.c.enchanting_fuels": "Combustibles Para Encantamientos", + "tag.item.c.end_stones": "Piedras del End", + "tag.item.c.feathers": "Plumas", + "tag.item.c.fences.nether_brick": "Vallas de Ladrillos del Nether", + "tag.item.c.foods": "Comida", + "tag.item.c.gravel": "Grava", + "tag.item.c.gunpowder": "Pólvora", + "tag.item.c.hoes": "Azadas", + "tag.item.c.lava_buckets": "Cubos de Lava", + "tag.item.c.leather": "Cuero", + "tag.item.c.milk_bottles": "Botellas de Leche", + "tag.item.c.milk_buckets": "Cubos de Leche", + "tag.item.c.nether_stars": "Estrellas del Nether", + "tag.item.c.netherrack": "Netherrack", + "tag.item.c.obsidian": "Obsidiana", + "tag.item.c.pickaxes": "Picos", + "tag.item.c.potions": "Pociones", + "tag.item.c.red_sandstone": "Arenisca Roja", + "tag.item.c.red_sandstone_slabs": "Losas de Arenisca Roja", + "tag.item.c.red_sandstone_stairs": "Escaleras de Arenisca Roja", + "tag.item.c.rods.blaze": "Varas de Blaze", + "tag.item.c.rods.wooden": "Varas de Madera", + "tag.item.c.sand.colorless": "Arena Incolora", + "tag.item.c.sand.red": "Arena Roja", + "tag.item.c.sandstone_slabs": "Losas de Arenisca", + "tag.item.c.sandstone_stairs": "Escaleras de Arenisca", + "tag.item.c.seeds.beetroot": "Semillas de Remolacha", + "tag.item.c.seeds.melon": "Semillas de Melón", + "tag.item.c.seeds.pumpkin": "Semillas de Calabaza", + "tag.item.c.seeds.wheat": "Semillas de Trigo", + "tag.item.c.shears": "Tijeras", + "tag.item.c.shields": "Escudos", + "tag.item.c.shovels": "Palas", + "tag.item.c.shulker_boxes": "Cajas de Shulker", + "tag.item.c.skulls": "Calaveras", + "tag.item.c.slime_balls": "Bolas de Slime", + "tag.item.c.slimeballs": "Bolas de Slime", + "tag.item.c.stone_dusts": "Polvos de Piedra", + "tag.item.c.stones": "Piedras", + "tag.item.c.string": "hilo", + "tag.item.c.strings": "hilos", + "tag.item.c.swords": "Espadas", + "tag.item.c.water_buckets": "Cubos de Agua", + "tag.item.c.wrenches": "Llaves Inglesas", + + "tag.item.c.budding_blocks": "Bloques Brotantes", + "tag.item.c.buds": "Brotes", + "tag.item.c.clusters": "Cúmulos", + "tag.item.c.entity_water_buckets": "Cubos de Agua de Entidad", + "tag.item.c.raw_ores": "Menas en Bruto", + "tag.item.c.red_sandstone_blocks": "Bloques de Arenisca Roja", + "tag.item.c.sandstone_blocks": "Bloques de Arenisca", + "tag.item.c.uncolored_sandstone_blocks": "Bloques de Arenisca Incolora", + "tag.item.c.uncolored_sandstone_slabs": "Losas de Arenisca Incolora", + "tag.item.c.uncolored_sandstone_stairs": "Escaleras de Arenisca Incolora", + "tag.item.c.villager_job_sites": "Lugares de Trabajo de Aldeanos", + "tag.item.c.wooden_barrels": "Barriles de Madera", + + "tag.item.c.armors": "Armadura", + "tag.item.c.armors.boots": "Botas", + "tag.item.c.armors.chestplates": "Petos", + "tag.item.c.armors.helmets": "Cascos", + "tag.item.c.armors.leggings": "Grebas", + "tag.item.c.tools": "Herramientas", + "tag.item.c.tools.axes": "Hachas", + "tag.item.c.tools.bows": "Arcos", + "tag.item.c.tools.crossbows": "Ballestas", + "tag.item.c.tools.fishing_rods": "Cañas de Pescar", + "tag.item.c.tools.hoes": "Azadas", + "tag.item.c.tools.pickaxes": "Picos", + "tag.item.c.tools.shields": "Escudos", + "tag.item.c.tools.shovels": "Palas", + "tag.item.c.tools.swords": "Espadas", + "tag.item.c.tools.tridents": "Tridentes", + + "tag.item.fabric.pickaxes": "Picos", + "tag.item.fabric.axes": "Hachas", + "tag.item.fabric.shovels": "Palas", + "tag.item.fabric.hoes": "Azadas", + "tag.item.fabric.swords": "Espadas", + "tag.item.fabric.shears": "Tijeras" +} diff --git a/xplat/src/main/resources/assets/emi/lang/zh_cn.json b/xplat/src/main/resources/assets/emi/lang/zh_cn.json index 68062783..82762a74 100644 --- a/xplat/src/main/resources/assets/emi/lang/zh_cn.json +++ b/xplat/src/main/resources/assets/emi/lang/zh_cn.json @@ -25,7 +25,7 @@ "key.emi.back": "返回", "config.emi.tooltip.binds.back": "回到上一个打开的EMI界面", "key.emi.forward": "前进", - "config.emi.tooltip.binds.forward": "在返回后重新打开被关闭的界面\n(就像浏览器的前进键)", + "config.emi.tooltip.binds.forward": "在返回后重新打开被关闭的界面\n(就像浏览器的前进键)", "key.emi.craft_one": "填充单次配方", "config.emi.tooltip.binds.craft_one": "在当前工作方块中填充单次合成配方", "key.emi.craft_all": "填充最大次配方", @@ -53,7 +53,7 @@ "key.emi.hide_stack": "隐藏物品", "config.emi.tooltip.binds.hide_stack": "仅在编辑模式下生效:\n在EMI中隐藏光标选中的物品", "key.emi.hide_stack_by_id": "隐藏物品ID", - "config.emi.tooltip.binds.hide_stack_by_id": "仅在编辑模式下生效:\n在EMI中隐藏所有与 光标选中物品 有相同ID的物品", + "config.emi.tooltip.binds.hide_stack_by_id": "仅在编辑模式下生效:\n在EMI中隐藏所有与光标选中物品有相同ID的物品", "emi.index_source.creative": "创造模式物品栏", "emi.index_source.registered": "物品注册顺序", @@ -91,10 +91,11 @@ "emi.sidebar.top": "顶部", "emi.sidebar.bottom": "底部", "emi.effect_location.top": "顶部", - "emi.effect_location.left_compressed": "左侧 (挤压)", - "emi.effect_location.right_compressed": "右侧 (挤压)", + "emi.effect_location.left_compressed": "左侧(挤压)", + "emi.effect_location.right_compressed": "右侧(挤压)", "emi.effect_location.left": "左侧", "emi.effect_location.right": "右侧", + "emi.effect_location.hidden": "隐藏", "emi.recipe_book_action.default": "原版行为", "emi.recipe_book_action.toggle_craftables": "侧边栏切换至可合成物品", "emi.recipe_book_action.toggle_visibility": "显示/隐藏EMI界面", @@ -102,7 +103,7 @@ "config.emi.group.general": "基础", "config.emi.group.general.search": "搜索", "config.emi.group.ui": "界面", - "config.emi.group.ui.mod_id": "模组信息", + "config.emi.group.ui.mod_id": "模组ID", "config.emi.group.ui.recipe_screen": "配方详情页", "config.emi.group.ui.recipe_buttons": "配方按钮", "config.emi.group.ui.left_sidebar": "左侧边栏", @@ -141,9 +142,9 @@ "config.emi.ui.recipe_book_action": "配方书按钮效果", "config.emi.tooltip.ui.recipe_book_action": "点击配方书按钮时执行的动作", "config.emi.ui.search_sidebar_focus": "搜索时侧边栏切换至", - "config.emi.tooltip.ui.search_sidebar_focus": "搜索栏中有内容时,右侧边栏切换至\n(需要在右侧边栏设置中添加相应标签页)", + "config.emi.tooltip.ui.search_sidebar_focus": "搜索栏中有内容时,右侧边栏切换至\n(需要在右侧边栏设置中添加相应标签页)", "config.emi.ui.empty_search_sidebar_focus": "未搜索时侧边栏切换至", - "config.emi.tooltip.ui.empty_search_sidebar_focus": "搜索栏为空时,右侧边栏切换至\n(需要在右侧边栏设置中添加相应标签页)", + "config.emi.tooltip.ui.empty_search_sidebar_focus": "搜索栏为空时,右侧边栏切换至\n(需要在右侧边栏设置中添加相应标签页)", "config.emi.ui.left_sidebar_pages": "标签页", "config.emi.ui.left_sidebar_subpanels": "固定信息", @@ -242,7 +243,7 @@ "config.emi.tooltip.dev.log_non_tag_ingredients": "在日志中警告没有添加标签的原材料", "config.emi.dev.show_recipe_ids": "显示配方ID", "config.emi.tooltip.dev.show_recipe_ids": "光标悬停于配方产物时显示配方的EMI ID", - "config.emi.dev.show_recipe_decorators": "Show Recipe Decorators", + "config.emi.dev.show_recipe_decorators": "显示配方装饰", "config.emi.dev.highlight_defaulted": "高亮有默认配方的物品", "config.emi.tooltip.dev.highlight_defaulted": "高亮物品索引中设置了默认配方的物品", "config.emi.dev.highlight_exclusion_areas": "高亮禁止区", @@ -255,7 +256,7 @@ "config.emi.presets.productive": "高效工作", "config.emi.tooltip.presets.productive": "右侧索引、左侧可合成、左上角收藏夹。\n完美利用EMI提供的功能!", "config.emi.presets.recipe_book_plus": "配方书增强", - "config.emi.tooltip.presets.recipe_book_plus": "将左侧边栏缩小用作配方书(显示可合成物品),\n也可切换成收藏夹", + "config.emi.tooltip.presets.recipe_book_plus": "将左侧边栏缩小用作配方书(显示可合成物品),\n也可切换成收藏夹", "config.emi.presets.empty_search_craftable": "未搜索时显示可合成物品", "config.emi.tooltip.presets.empty_search_craftable": "右侧边栏使用“物品索引”与“可合成物品”:\n不搜索时显示可合成物品\n搜索时显示物品索引", @@ -275,13 +276,13 @@ "emi.fluid.amount.droplets": "%s d", "emi.disabled": "EMI被禁用! 开关: ", - "emi.reloading": "EMI重载中……", - "emi.reloading.waiting": "EMI正等待服务器发送配方信息……", + "emi.reloading": "EMI重载中...", + "emi.reloading.waiting": "EMI正等待服务器发送配方信息...", "emi.reloading.error": "§cEMI重载时出现严重错误,请查看日志", "emi.reloading.worry": "§c延迟较大,网络还正常吗?", - "emi.reloading.still_baking_recipes": "§d正在处理配方……", - "emi.search": "搜索EMI……", - "emi.search_config": "搜索设置项……", + "emi.reloading.still_baking_recipes": "§d正在处理配方...", + "emi.search": "搜索EMI...", + "emi.search_config": "搜索设置项...", "emi.delete_stack": "§c删除光标上的物品", "emi.inapplicable": "当前工作方块不支持该配方", "emi.not_enough_ingredients": "材料不足,无法填充配方", @@ -296,7 +297,7 @@ "emi.leftovers": "副产物", "emi.view_all_recipes": "点击显示所有配方", "emi.tree_welcome": "欢迎来到 %s", - "emi.no_tree": "你尚未选择任何配方树……", + "emi.no_tree": "你尚未选择任何配方树...", "emi.random_tree": "要不要随便看看?", "emi.random_tree_input": "请按 §6[Ctrl + R]", "emi.edit_mode.hide_one": "按 %s 隐藏物品", @@ -332,8 +333,8 @@ "tooltip.emi.bom.batch_size.ideal": "按 %s 将副产物数量降到最低", "tooltip.emi.bom.mode.view": "正在§6查看§r配方树", "tooltip.emi.bom.mode.craft": "正在§6制作§r配方树\n配方树中会显示制作进度\n§b收藏夹§r中可查看并快捷合成", - "tooltip.emi.bom.help": "欢迎使用配方树\n这里可以分析物品的制作过程和原材料消耗\n按 §6[Ctrl + R]§r 可展示随机配方树\n本界面可以拖动或缩放\n\n配方树会自动使用默认配方分析制作过程\n配方详情页中可以更改默认配方\n\n左键物品/节点可手动选择配方\n按住 §6[Shift]§r 左键自动选择配方(根据物品栏)\n\n右键节点可以暂时折叠配方\n按住 §6[Shift]§r 右键节点可以清除配方\n\n选中最终产物旁的数可以改变产物份数\n\n总耗材旁的按钮可切换至§6制作§r模式\n在§6制作§r模式下,§b收藏夹§r中会显示需要收集的材料\n和中间产物,这些中间产物可以点击以快速合成", - + "tooltip.emi.bom.help": "欢迎使用配方树\n这里可以分析物品的制作过程和原材料消耗\n按 §6[Ctrl + R]§r 可展示随机配方树\n本界面可以拖动或缩放\n\n配方树会自动使用默认配方分析制作过程\n配方详情页中可以更改默认配方\n\n左键物品/节点可手动选择配方\n按住 §6[Shift]§r 左键自动选择配方(根据物品栏)\n\n右键节点可以暂时折叠配方\n按住 §6[Shift]§r 右键节点可以清除配方\n\n选中最终产物旁的数可以改变产物份数\n\n总耗材旁的按钮可切换至§6制作§r模式\n在§6制作§r模式下,§b收藏夹§r中会显示需要收集的材料\n和中间产物,这些中间产物可以点击以快速合成", + "tooltip.emi.fluid_interaction.basalt.soul_soil": "在熔岩下方", "tooltip.emi.fluid_interaction.basalt.blue_ice": "与熔岩齐平", @@ -346,6 +347,17 @@ "emi.error.recipe.initialize": "初始化时出现错误", "emi.error.recipe.render": "渲染时出现错误", + "emi.dev.severity.error": "错误", + "emi.dev.severity.warning": "警告", + "emi.dev.null_recipe_id": "配方ID为 §7null§r\n配方的序列化需要有唯一的ID\n这将只用于此配方", + "emi.dev.duplicate_recipe_id": "配方ID与以下配方重复:\n§7%s§r\n配方的序列化需要有唯一的ID\n这将破坏其他使用此ID的配方", + "emi.dev.duplicate_vanilla_recipe_id": "配方ID与以下原版配方重复:\n§7%s§r\n配方的序列化需要有唯一的ID\n这将破坏其他使用此ID的原版配方", + "emi.dev.synthetic_id": "使用合成的ID §7[namespace]§b:/§7[path]§r", + "emi.dev.suggest_id": "使用合成的ID §7[namespace]§b:/§7[path]§r 比如\n§7%s§b:/§7%s§r", + "emi.dev.null_input_or_output": "配方的输入或输出为 §7null§r\n如果没有输入或输出请使用一个空列表\n使用 §7EmiStack.EMPTY§r 来表示这是一个空配方", + "emi.dev.no_output_slots": "配方不包含任何输出的槽位\n在输出槽位上调用 §7SlotWidget.recipeContext(this)§r", + "emi.dev.synthetic_nag_explanation": "配方ID未能在配方管理器中找到,而且不是合成的\n§7%s§r\n如果配方与数据驱动的JSON配方不对应,则应使用合成的ID", + "emi.chess.piece.white_pawn": "白方士兵", "emi.chess.piece.white_rook": "白方战车", "emi.chess.piece.white_knight": "白方骑士", @@ -386,6 +398,7 @@ "emi.category.emi.fuel": "燃料", "emi.category.emi.composting": "堆肥", "emi.category.emi.info": "信息", + "emi.category.emi.tag": "标签", "emi.category.emi.ingredient": "合成材料", @@ -588,7 +601,7 @@ "tag.item.c.ores_in_ground.stone": "石头矿", "tag.item.c.ores_in_ground.deepslate": "深板岩矿", "tag.item.c.ores_in_ground.netherrack": "下界岩矿", - + "tag.item.c.chest": "箱子", "tag.item.c.coal": "煤炭", "tag.item.c.sand": "沙子",