diff --git a/build/generated/sources/modMetadata/META-INF/neoforge.mods.toml b/build/generated/sources/modMetadata/META-INF/neoforge.mods.toml index 27f14f0..81b31c6 100644 --- a/build/generated/sources/modMetadata/META-INF/neoforge.mods.toml +++ b/build/generated/sources/modMetadata/META-INF/neoforge.mods.toml @@ -19,7 +19,7 @@ license = "LGPL-3.0-or-later" # A list of mods - how many allowed here is determined by the individual mod loader [[mods]] modId = "extendedae_plus" -version = "1.21.1-1.5.0" +version = "1.21.1-1.5.1" displayName = "ExtendedAE-Plus" issueTrackerURL = "https://github.com/GaLicn/ExtendedAE_Plus/issues" displayURL = "https://github.com/GaLicn/ExtendedAE_Plus" diff --git a/src/main/java/com/extendedae_plus/client/screen/GlobalProviderModesScreen.java b/src/main/java/com/extendedae_plus/client/screen/GlobalProviderModesScreen.java index 18fdf39..dc660e7 100644 --- a/src/main/java/com/extendedae_plus/client/screen/GlobalProviderModesScreen.java +++ b/src/main/java/com/extendedae_plus/client/screen/GlobalProviderModesScreen.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.player.Inventory; import net.neoforged.neoforge.network.PacketDistributor; public class GlobalProviderModesScreen extends AbstractContainerScreen { - private static final Component CUSTOM_TITLE = Component.literal("样板供应器状态控制器"); + private static final Component CUSTOM_TITLE = Component.translatable("extendedae_plus.screen.global_controller_title"); public GlobalProviderModesScreen(NetworkPatternControllerMenu menu, Inventory inv, Component title) { super(menu, inv, title); this.imageWidth = 240; diff --git a/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java b/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java index 1167281..b73c910 100644 --- a/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java +++ b/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java @@ -106,13 +106,13 @@ public class ProviderSelectScreen extends Screen { ExtendedAEPatternUploadUtil.loadRecipeTypeNames(); var player = Minecraft.getInstance().player; if (player != null) { - player.sendSystemMessage(Component.literal("ExtendedAE Plus: 已重载映射表")); + player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.reload_success")); } // 重载后不强制刷新筛选,但如需立即应用到名称匹配,可手动编辑搜索框或翻页 } catch (Throwable t) { var player = Minecraft.getInstance().player; if (player != null) { - player.sendSystemMessage(Component.literal("ExtendedAE Plus: 重载映射表失败: " + t.getClass().getSimpleName())); + player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.reload_fail", t.getClass().getSimpleName())); } } } @@ -335,16 +335,16 @@ public class ProviderSelectScreen extends Screen { String val = this.cnInput == null ? "" : this.cnInput.getValue().trim(); var player = Minecraft.getInstance().player; if (key.isEmpty()) { - if (player != null) player.sendSystemMessage(Component.literal("请输入搜索关键字后再添加映射")); + if (player != null) player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.search_required")); return; } if (val.isEmpty()) { - if (player != null) player.sendSystemMessage(Component.literal("请输入中文名称")); + if (player != null) player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.cn_required")); return; } boolean ok = ExtendedAEPatternUploadUtil.addOrUpdateAliasMapping(key, val); if (ok) { - if (player != null) player.sendSystemMessage(Component.literal("已添加/更新映射: " + key + " -> " + val)); + if (player != null) player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.add_success", key, val)); // 将刚添加的中文名写入搜索框,作为当前查询 this.query = val; if (this.searchBox != null) { @@ -356,7 +356,7 @@ public class ProviderSelectScreen extends Screen { this.page = 0; this.needsRefresh = true; } else { - if (player != null) player.sendSystemMessage(Component.literal("写入映射失败")); + if (player != null) player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.add_fail")); } } @@ -365,16 +365,16 @@ public class ProviderSelectScreen extends Screen { String val = this.cnInput == null ? "" : this.cnInput.getValue().trim(); var player = Minecraft.getInstance().player; if (val.isEmpty()) { - if (player != null) player.sendSystemMessage(Component.literal("请输入中文名称后再删除映射")); + if (player != null) player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.delete_cn_required")); return; } int removed = ExtendedAEPatternUploadUtil.removeMappingsByCnValue(val); if (removed > 0) { - if (player != null) player.sendSystemMessage(Component.literal("已删除 " + removed + " 条映射,中文= " + val)); + if (player != null) player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.delete_success", removed, val)); this.applyFilter(); this.needsRefresh = true; } else { - if (player != null) player.sendSystemMessage(Component.literal("未找到中文为 '" + val + "' 的映射")); + if (player != null) player.sendSystemMessage(Component.translatable("extendedae_plus.message.mapping.delete_not_found", val)); } } diff --git a/src/main/java/com/extendedae_plus/content/wireless/WirelessTransceiverBlock.java b/src/main/java/com/extendedae_plus/content/wireless/WirelessTransceiverBlock.java index 662b540..6019c15 100644 --- a/src/main/java/com/extendedae_plus/content/wireless/WirelessTransceiverBlock.java +++ b/src/main/java/com/extendedae_plus/content/wireless/WirelessTransceiverBlock.java @@ -76,13 +76,13 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock { String teamName = ChannelCardItem.getTeamName(channelCard); te.setPlacerId(cardOwner, teamName); player.displayClientMessage( - Component.literal("已将收发器绑定至:" + (teamName != null ? teamName : cardOwner.toString().substring(0, 8))), + Component.translatable("extendedae_plus.message.transceiver.bound", teamName != null ? teamName : cardOwner.toString().substring(0, 8)), true ); } else { // 频道卡未绑定所有者,使用当前玩家 te.setPlacerId(player.getUUID(), player.getName().getString()); - player.displayClientMessage(Component.literal("频道卡未绑定,已使用当前玩家"), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.card_unbound_use_self"), true); } } @@ -107,7 +107,7 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock { if (sneaking) { if (te.isLocked()) { if (!level.isClientSide) { - player.displayClientMessage(Component.literal("收发器已锁定,无法修改频道"), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.locked_change_channel"), true); } } else { long f = te.getFrequency(); @@ -115,20 +115,22 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock { f += 1; te.setFrequency(f); if (!level.isClientSide) { - player.displayClientMessage(Component.literal("频道:" + te.getFrequency()), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.channel", te.getFrequency()), true); } } return InteractionResult.sidedSuccess(level.isClientSide); } else { if (te.isLocked()) { if (!level.isClientSide) { - player.displayClientMessage(Component.literal("收发器已锁定,无法切换模式"), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.locked_toggle_mode"), true); } return InteractionResult.sidedSuccess(level.isClientSide); } te.setMasterMode(!te.isMasterMode()); if (!level.isClientSide) { - player.displayClientMessage(Component.literal(te.isMasterMode() ? "模式:主端" : "模式:从端"), true); + player.displayClientMessage(Component.translatable(te.isMasterMode() + ? "extendedae_plus.message.transceiver.mode_master" + : "extendedae_plus.message.transceiver.mode_slave"), true); } return InteractionResult.sidedSuccess(level.isClientSide); } @@ -147,7 +149,7 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock { if (sneaking) { if (te.isLocked()) { if (!level.isClientSide) { - player.displayClientMessage(Component.literal("收发器已锁定,无法修改频道"), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.locked_change_channel"), true); } } else { int step = 1; @@ -163,20 +165,22 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock { } te.setFrequency(f); if (!level.isClientSide) { - player.displayClientMessage(Component.literal("频道:" + te.getFrequency()), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.channel", te.getFrequency()), true); } } return ItemInteractionResult.sidedSuccess(level.isClientSide); } else { if (te.isLocked()) { if (!level.isClientSide) { - player.displayClientMessage(Component.literal("收发器已锁定,无法切换模式"), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.locked_toggle_mode"), true); } return ItemInteractionResult.sidedSuccess(level.isClientSide); } te.setMasterMode(!te.isMasterMode()); if (!level.isClientSide) { - player.displayClientMessage(Component.literal(te.isMasterMode() ? "模式:主端" : "模式:从端"), true); + player.displayClientMessage(Component.translatable(te.isMasterMode() + ? "extendedae_plus.message.transceiver.mode_master" + : "extendedae_plus.message.transceiver.mode_slave"), true); } return ItemInteractionResult.sidedSuccess(level.isClientSide); } @@ -199,7 +203,7 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock { // 潜行左键(其他物品):减频(-1 或 -10) if (player.isShiftKeyDown()) { if (te.isLocked()) { - player.displayClientMessage(Component.literal("收发器已锁定,无法修改频道"), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.locked_change_channel"), true); super.attack(state, level, pos, player); return; } @@ -210,7 +214,7 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock { f -= step; if (f < 0) f = 0; te.setFrequency(f); - player.displayClientMessage(Component.literal("频道:" + te.getFrequency()), true); + player.displayClientMessage(Component.translatable("extendedae_plus.message.transceiver.channel", te.getFrequency()), true); } } } diff --git a/src/main/java/com/extendedae_plus/integration/jade/WirelessTransceiverJadePluginComponents.java b/src/main/java/com/extendedae_plus/integration/jade/WirelessTransceiverJadePluginComponents.java index e8c2bfe..13aa90b 100644 --- a/src/main/java/com/extendedae_plus/integration/jade/WirelessTransceiverJadePluginComponents.java +++ b/src/main/java/com/extendedae_plus/integration/jade/WirelessTransceiverJadePluginComponents.java @@ -27,7 +27,8 @@ public enum WirelessTransceiverJadePluginComponents implements IBlockComponentPr protected void add(BlockAccessor accessor, ITooltip tooltip, IPluginConfig config, CompoundTag data) { if (data.contains("masterMode")) { boolean masterMode = data.getBoolean("masterMode"); - tooltip.add(Component.translatable("extendedae_plus.tooltip.master_mode", masterMode ? "主模式" : "从模式")); + tooltip.add(Component.translatable("extendedae_plus.tooltip.master_mode", + Component.translatable(masterMode ? "extendedae_plus.state.master" : "extendedae_plus.state.slave"))); } } }, @@ -39,12 +40,12 @@ public enum WirelessTransceiverJadePluginComponents implements IBlockComponentPr String dim = data.contains("masterDim") ? data.getString("masterDim") : ""; String customName = data.contains("customName") ? data.getString("customName") : null; if (customName != null) { - tooltip.add(Component.literal("主节点: " + customName + "(" + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + ")")); + tooltip.add(Component.translatable("extendedae_plus.jade.master_named", customName, pos.getX(), pos.getY(), pos.getZ())); } else { - tooltip.add(Component.literal("主节点位置: (" + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + ")")); + tooltip.add(Component.translatable("extendedae_plus.jade.master_pos", pos.getX(), pos.getY(), pos.getZ())); } if (!dim.isEmpty()) { - tooltip.add(Component.literal("维度: " + dim)); + tooltip.add(Component.translatable("extendedae_plus.jade.dimension", dim)); } } } @@ -54,7 +55,8 @@ public enum WirelessTransceiverJadePluginComponents implements IBlockComponentPr protected void add(BlockAccessor accessor, ITooltip tooltip, IPluginConfig config, CompoundTag data) { if (data.contains("locked")) { boolean locked = data.getBoolean("locked"); - tooltip.add(Component.translatable("extendedae_plus.tooltip.locked", locked ? "已锁定" : "未锁定")); + tooltip.add(Component.translatable("extendedae_plus.tooltip.locked", + Component.translatable(locked ? "extendedae_plus.state.locked" : "extendedae_plus.state.unlocked"))); } } }, @@ -63,7 +65,9 @@ public enum WirelessTransceiverJadePluginComponents implements IBlockComponentPr protected void add(BlockAccessor accessor, ITooltip tooltip, IPluginConfig config, CompoundTag data) { if (data.contains("networkUsable")) { boolean usable = data.getBoolean("networkUsable"); - tooltip.add(Component.literal((usable ? "设备在线" : "设备离线"))); + tooltip.add(Component.translatable(usable + ? "extendedae_plus.jade.network.online" + : "extendedae_plus.jade.network.offline")); } } }, diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java index 5321188..ff5a714 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java @@ -66,7 +66,7 @@ public abstract class HighlightButtonMixin { // 提示玩家已选择供应器 if (minecraft.player != null) { minecraft.player.displayClientMessage( - Component.literal("ExtendedAE Plus: 已选择样板供应器 (ID=" + serverId + "),可按住Shift左键快速上传样板"), + Component.translatable("extendedae_plus.message.provider.selected", serverId), true ); } diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java index b1b6013..a986e9a 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java @@ -121,7 +121,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen // 显示提示消息:请先选择一个样板供应器 if (this.minecraft.player != null) { this.minecraft.player.displayClientMessage( - Component.literal("ExtendedAE Plus: 请先选择一个样板供应器(点击GroupHeader旁的按钮)"), + Component.translatable("extendedae_plus.message.provider.select_first"), true ); } @@ -150,13 +150,13 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen } catch (Throwable t) { // 理论上不会失败,若失败则给出简要提示 this.minecraft.player.displayClientMessage( - Component.literal("❌ ExtendedAE Plus: 客户端发送上传请求失败"), + Component.translatable("extendedae_plus.message.upload.client_fail"), true ); } } else { this.minecraft.player.displayClientMessage( - Component.literal("❌ ExtendedAE Plus: 无效的样板物品"), + Component.translatable("extendedae_plus.message.upload.invalid_item"), true ); } @@ -209,7 +209,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen if (info == null) { // 无位置信息,提示 if (this.minecraft != null && this.minecraft.player != null) { - this.minecraft.player.displayClientMessage(Component.literal("未找到该供应器的位置信息,无法打开UI"), true); + this.minecraft.player.displayClientMessage(Component.translatable("extendedae_plus.message.provider.location_missing"), true); } return; } @@ -534,7 +534,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen btn = Button.builder(Component.literal("UI"), (b) -> { eap$tryOpenProviderUI(rowIndex); }).size(14, 12).build(); - btn.setTooltip(Tooltip.create(Component.literal("打开该供应器目标容器的界面"))); + btn.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.tooltip.provider.open_ui"))); eap$openUIButtons.put(rowIndex, btn); this.addRenderableWidget(btn); } diff --git a/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java b/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java index c4dd8b9..b4a2cb0 100644 --- a/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java @@ -75,6 +75,7 @@ public class GlobalToggleProviderModesC2SPacket implements CustomPacketPayload { var level = player.serverLevel(); var blockEntity = level.getBlockEntity(message.controllerBlockPos); + if (!(blockEntity instanceof IInWorldGridNodeHost gridNodeHost)) return; var gridNode = gridNodeHost.getGridNode(null); @@ -87,7 +88,7 @@ public class GlobalToggleProviderModesC2SPacket implements CustomPacketPayload { // 给发起者一个短暂的行动条提示,方便知道本次操作实际影响了多少个供应器 player.displayClientMessage( - Component.literal("E+ 全局切换已应用到 " + affectedCount + " 个样板供应器"), + Component.translatable("extendedae_plus.message.global_toggle_applied", affectedCount), true); }); } diff --git a/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java b/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java index 7159d2f..154e3b4 100644 --- a/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java +++ b/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java @@ -51,10 +51,9 @@ public class ExtendedAEPatternUploadUtil { // --------------------------- 配置:RecipeType 中文名称映射 --------------------------- private static final String CONFIG_RELATIVE = "extendedae_plus/recipe_type_names.json"; private static final Map CUSTOM_NAMES = new ConcurrentHashMap<>(); - // 允许使用最终搜索关键字(通常为 path 或自定义短语)作为键,例如:"assembler": "组装机" private static final Map CUSTOM_ALIASES = new ConcurrentHashMap<>(); private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); - // 最近一次通过 JEI 填充到编码终端的“处理配方”的中文名称(如:烧炼/高炉/烟熏...) + // 最近一次通过 JEI 填充到编码终端的“处理配方”的中文名称(如:烧炼/高炉/烟熏...) public static volatile String lastProcessingName = null; static { @@ -413,7 +412,7 @@ public class ExtendedAEPatternUploadUtil { .eap$getEncodedPatternSlot(); ItemStack stack = encodedSlot.getItem(); if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) { - sendMessage(player, "ExtendedAE Plus: 没有可上传的编码样板"); + sendMessage(player, "extendedae_plus.message.upload.no_pattern"); return false; } @@ -437,7 +436,7 @@ public class ExtendedAEPatternUploadUtil { } } catch (Throwable ignored) {} if (grid == null) { - sendMessage(player, "ExtendedAE Plus: 当前不在有效的 AE 网络中"); + sendMessage(player, "extendedae_plus.message.network.invalid"); return false; } @@ -445,7 +444,7 @@ public class ExtendedAEPatternUploadUtil { if (matrixContainsPattern(grid, stack)) { // 直接提醒并跳过上传,并将同等数量的空白样板放回空白样板槽,否则退回玩家背包 if (player != null) { - player.sendSystemMessage(Component.literal("ExtendedAE Plus: 装配矩阵已存在相同样板,已跳过上传并返还空白样板")); + player.sendSystemMessage(Component.translatable("extendedae_plus.message.matrix.duplicate")); } try { var accessor = (PatternEncodingTermMenuAccessor) (Object) menu; @@ -644,34 +643,34 @@ public class ExtendedAEPatternUploadUtil { // 1. 验证玩家是否打开了样板访问终端 PatternAccessTermMenu menu = getPatternAccessMenu(player); if (menu == null) { - sendMessage(player, "ExtendedAE Plus: 请先打开样板访问终端或扩展样板管理终端"); + sendMessage(player, "extendedae_plus.message.open_terminal_first"); return false; } // 2. 获取玩家背包中的物品 ItemStack playerItem = player.getInventory().getItem(playerSlotIndex); if (playerItem.isEmpty()) { - sendMessage(player, "ExtendedAE Plus: 背包槽位为空"); + sendMessage(player, "extendedae_plus.message.inventory_slot_empty"); return false; } // 3. 验证是否是编码样板 if (!PatternDetailsHelper.isEncodedPattern(playerItem)) { - sendMessage(player, "ExtendedAE Plus: 该物品不是有效的编码样板"); + sendMessage(player, "extendedae_plus.message.invalid_pattern_item"); return false; } // 4. 获取目标样板供应器 PatternContainer patternContainer = getPatternContainerById(menu, providerId); if (patternContainer == null) { - sendMessage(player, "ExtendedAE Plus: 找不到指定的样板供应器 (ID: " + providerId + ")"); + sendMessage(player, "extendedae_plus.message.provider.not_found", providerId); return false; } // 5. 获取样板供应器的库存 InternalInventory patternInventory = patternContainer.getTerminalPatternInventory(); if (patternInventory == null) { - sendMessage(player, "ExtendedAE Plus: 无法访问样板供应器的库存"); + sendMessage(player, "extendedae_plus.message.provider.inventory_unavailable"); return false; } @@ -681,22 +680,24 @@ public class ExtendedAEPatternUploadUtil { // 7. 尝试插入样板 ItemStack itemToInsert = playerItem.copy(); - ItemStack remaining = filteredInventory.addItems(itemToInsert); - - if (remaining.getCount() < itemToInsert.getCount()) { - // 插入成功(部分或全部) - int insertedCount = itemToInsert.getCount() - remaining.getCount(); + ItemStack remain = filteredInventory.addItems(itemToInsert); + int insertedCount = itemToInsert.getCount() - remain.getCount(); + if (insertedCount > 0) { playerItem.shrink(insertedCount); - if (playerItem.isEmpty()) { player.getInventory().setItem(playerSlotIndex, ItemStack.EMPTY); + } else { + player.getInventory().setItem(playerSlotIndex, playerItem); } - - String terminalType = isExtendedAETerminal(player) ? "扩展样板管理终端" : "样板访问终端"; - sendMessage(player, "ExtendedAE Plus: 通过" + terminalType + "成功上传 " + insertedCount + " 个样板"); + + String terminalTypeKey = isExtendedAETerminal(player) + ? "extendedae_plus.terminal.expattern" + : "extendedae_plus.terminal.pattern_access"; + sendMessage(player, "extendedae_plus.message.upload.success_single", + Component.translatable(terminalTypeKey), insertedCount); return true; } else { - sendMessage(player, "ExtendedAE Plus: 上传失败 - 样板供应器已满或样板无效"); + sendMessage(player, "extendedae_plus.message.upload.fail"); return false; } } @@ -718,8 +719,11 @@ public class ExtendedAEPatternUploadUtil { } } - String terminalType = isExtendedAETerminal(player) ? "扩展样板管理终端" : "样板访问终端"; - sendMessage(player, "ExtendedAE Plus: 通过" + terminalType + "批量上传完成,成功上传 " + successCount + " 个样板"); + String terminalTypeKey = isExtendedAETerminal(player) + ? "extendedae_plus.terminal.expattern" + : "extendedae_plus.terminal.pattern_access"; + sendMessage(player, "extendedae_plus.message.upload.success_batch", + Component.translatable(terminalTypeKey), successCount); return successCount; } @@ -796,7 +800,7 @@ public class ExtendedAEPatternUploadUtil { // 通过反射访问byId字段(ExtendedAE继承了这个字段) Field byIdField = findByIdField(menu.getClass()); if (byIdField == null) { - System.err.println("ExtendedAE Plus: 无法找到byId字段"); + System.err.println("ExtendedAE Plus: Unable to find byId field"); return null; } @@ -813,7 +817,7 @@ public class ExtendedAEPatternUploadUtil { // 从ContainerTracker中获取PatternContainer Field containerField = findContainerField(containerTracker.getClass()); if (containerField == null) { - System.err.println("ExtendedAE Plus: 无法找到container字段"); + System.err.println("ExtendedAE Plus: Unable to find container field"); return null; } @@ -821,7 +825,7 @@ public class ExtendedAEPatternUploadUtil { return (PatternContainer) containerField.get(containerTracker); } catch (Exception e) { - System.err.println("ExtendedAE Plus: 无法获取PatternContainer,错误: " + e.getMessage()); + System.err.println("ExtendedAE Plus: Failed to get PatternContainer, error: " + e.getMessage()); return null; } } @@ -860,13 +864,14 @@ public class ExtendedAEPatternUploadUtil { * 发送消息给玩家 * * @param player 玩家 - * @param message 消息内容 + * @param key 翻译键 + * @param args 参数 */ - private static void sendMessage(ServerPlayer player, String message) { + private static void sendMessage(ServerPlayer player, String key, Object... args) { // 静默:不再向玩家左下角发送任何提示信息 // 如需恢复,取消下面注释即可: // if (player != null) { - // player.sendSystemMessage(Component.literal(message)); + // player.sendSystemMessage(Component.translatable(key, args)); // } // 如果玩家为null,静默忽略(用于测试环境) } @@ -881,7 +886,7 @@ public class ExtendedAEPatternUploadUtil { public static String getProviderDisplayName(long providerId, PatternAccessTermMenu menu) { PatternContainer container = getPatternContainerById(menu, providerId); if (container == null) { - return "未知供应器"; + return Component.translatable("extendedae_plus.provider.unknown").getString(); } try { @@ -894,7 +899,7 @@ public class ExtendedAEPatternUploadUtil { // 忽略异常,使用默认名称 } - return "样板供应器 #" + providerId; + return Component.translatable("extendedae_plus.provider.named_id", providerId).getString(); } /** @@ -927,11 +932,11 @@ public class ExtendedAEPatternUploadUtil { */ public static String getTerminalTypeDescription(ServerPlayer player) { if (isExtendedAETerminal(player)) { - return "ExtendedAE扩展样板管理终端"; + return Component.translatable("extendedae_plus.terminal.expattern").getString(); } else if (getPatternAccessMenu(player) != null) { - return "AE2样板访问终端"; + return Component.translatable("extendedae_plus.terminal.pattern_access").getString(); } else { - return "未知终端类型"; + return Component.translatable("extendedae_plus.terminal.unknown").getString(); } } diff --git a/src/main/resources/assets/extendedae_plus/lang/en_us.json b/src/main/resources/assets/extendedae_plus/lang/en_us.json index 3e9d69f..2ca952e 100644 --- a/src/main/resources/assets/extendedae_plus/lang/en_us.json +++ b/src/main/resources/assets/extendedae_plus/lang/en_us.json @@ -170,5 +170,65 @@ "gui.tooltips.extendedae_plus.AdvancedBlockingDisabled": "Use vanilla blocking logic", "gui.tooltips.extendedae_plus.SmartDoubling": "Smart Doubling", "gui.tooltips.extendedae_plus.SmartDoublingEnabled": "Intelligently double processing patterns based on request quantity", - "gui.tooltips.extendedae_plus.SmartDoublingDisabled": "Distribute according to original pattern quantity" + "gui.tooltips.extendedae_plus.SmartDoublingDisabled": "Distribute according to original pattern quantity", + + "extendedae_plus.message.mapping.reload_success": "Mapping reloaded.", + "extendedae_plus.message.mapping.reload_fail": "Failed to reload mapping (%s).", + "extendedae_plus.message.mapping.search_required": "Please enter a search keyword.", + "extendedae_plus.message.mapping.cn_required": "Please enter a Chinese name.", + "extendedae_plus.message.mapping.add_success": "Added mapping: %s -> %s.", + "extendedae_plus.message.mapping.add_fail": "Failed to add mapping.", + "extendedae_plus.message.mapping.delete_cn_required": "Please enter the Chinese name to delete.", + "extendedae_plus.message.mapping.delete_success": "Deleted %d mapping(s) for \"%s\".", + "extendedae_plus.message.mapping.delete_not_found": "No mapping found for \"%s\".", + + "extendedae_plus.message.upload.no_pattern": "No encoded pattern found.", + "extendedae_plus.message.network.invalid": "Unable to access AE network.", + "extendedae_plus.message.matrix.duplicate": "Assembly matrix already contains this pattern.", + "extendedae_plus.message.open_terminal_first": "Please open a pattern terminal first.", + "extendedae_plus.message.inventory_slot_empty": "The selected inventory slot is empty.", + "extendedae_plus.message.invalid_pattern_item": "Item is not an encoded pattern.", + "extendedae_plus.message.provider.not_found": "Pattern provider %s not found.", + "extendedae_plus.message.provider.inventory_unavailable": "Provider inventory is unavailable.", + "extendedae_plus.message.upload.success_single": "Uploaded to %s: %d pattern(s).", + "extendedae_plus.message.upload.fail": "Pattern upload failed.", + "extendedae_plus.message.upload.success_batch": "Batch uploaded to %s: %d patterns.", + "extendedae_plus.message.upload.quick_success": "✅ Pattern quick-upload succeeded!", + "extendedae_plus.message.upload.quick_fail": "❌ Pattern quick-upload failed. Check provider status.", + "extendedae_plus.message.upload.client_fail": "❌ Failed to send upload request from client.", + "extendedae_plus.message.upload.invalid_item": "❌ Invalid pattern item.", + "extendedae_plus.message.provider.select_first": "Select a pattern provider first (use the button beside GroupHeader).", + "extendedae_plus.message.provider.location_missing": "Location info for this provider not found; cannot open UI.", + "extendedae_plus.message.provider.selected": "Selected pattern provider (ID=%s). Hold Shift+Left Click to quick upload.", + "extendedae_plus.message.global_toggle_applied": "Applied mode toggle to %d provider(s).", + + "extendedae_plus.provider.unknown": "Unknown provider", + "extendedae_plus.provider.named_id": "Provider #%s", + + "extendedae_plus.terminal.expattern": "ExtendedAE Pattern Terminal", + "extendedae_plus.terminal.pattern_access": "AE2 Pattern Access Terminal", + "extendedae_plus.terminal.unknown": "Unknown terminal", + + "extendedae_plus.tooltip.provider.open_ui": "Open this provider's target container UI", + + "extendedae_plus.message.transceiver.bound": "Transceiver bound to: %s", + "extendedae_plus.message.transceiver.card_unbound_use_self": "Channel card unbound; using current player.", + "extendedae_plus.message.transceiver.locked_change_channel": "Transceiver is locked; cannot change channel.", + "extendedae_plus.message.transceiver.locked_toggle_mode": "Transceiver is locked; cannot toggle mode.", + "extendedae_plus.message.transceiver.channel": "Channel: %d", + "extendedae_plus.message.transceiver.mode_master": "Mode: Master", + "extendedae_plus.message.transceiver.mode_slave": "Mode: Slave", + + "extendedae_plus.state.master": "Master", + "extendedae_plus.state.slave": "Slave", + "extendedae_plus.state.locked": "Locked", + "extendedae_plus.state.unlocked": "Unlocked", + + "extendedae_plus.jade.master_named": "Master Node: %s (%d, %d, %d)", + "extendedae_plus.jade.master_pos": "Master Node: (%d, %d, %d)", + "extendedae_plus.jade.dimension": "Dimension: %s", + "extendedae_plus.jade.network.online": "Online", + "extendedae_plus.jade.network.offline": "Offline", + + "extendedae_plus.screen.global_controller_title": "Pattern Provider Status Controller" } \ No newline at end of file diff --git a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json index 1307bb9..44e17d0 100644 --- a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json +++ b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json @@ -169,5 +169,61 @@ "gui.tooltips.extendedae_plus.AdvancedBlockingDisabled": "使用原版阻挡逻辑", "gui.tooltips.extendedae_plus.SmartDoubling": "智能翻倍", "gui.tooltips.extendedae_plus.SmartDoublingEnabled": "根据请求量对处理样板进行智能翻倍", - "gui.tooltips.extendedae_plus.SmartDoublingDisabled": "按原始样板数量进行发配" + "gui.tooltips.extendedae_plus.SmartDoublingDisabled": "按原始样板数量进行发配", + + "extendedae_plus.message.mapping.reload_success": "映射已重载。", + "extendedae_plus.message.mapping.reload_fail": "重载映射失败(%s)。", + "extendedae_plus.message.mapping.search_required": "请输入搜索关键字。", + "extendedae_plus.message.mapping.cn_required": "请输入中文名称。", + "extendedae_plus.message.mapping.add_success": "已添加映射:%s -> %s。", + "extendedae_plus.message.mapping.add_fail": "添加映射失败。", + "extendedae_plus.message.mapping.delete_cn_required": "请输入要删除的中文名称。", + "extendedae_plus.message.mapping.delete_success": "已删除 \"%s\" 的映射,共 %d 条。", + "extendedae_plus.message.mapping.delete_not_found": "未找到 \"%s\" 的映射。", + + "extendedae_plus.message.upload.no_pattern": "未找到已编码样板。", + "extendedae_plus.message.network.invalid": "无法访问 AE 网络。", + "extendedae_plus.message.matrix.duplicate": "装配矩阵已存在该样板。", + "extendedae_plus.message.open_terminal_first": "请先打开样板终端。", + "extendedae_plus.message.inventory_slot_empty": "选中的物品栏槽位为空。", + "extendedae_plus.message.invalid_pattern_item": "该物品不是编码样板。", + "extendedae_plus.message.provider.not_found": "未找到样板供应器 %s。", + "extendedae_plus.message.provider.inventory_unavailable": "供应器库存不可用。", + "extendedae_plus.message.upload.success_single": "已上传到 %s:%d 个样板。", + "extendedae_plus.message.upload.fail": "样板上传失败。", + "extendedae_plus.message.upload.success_batch": "批量上传到 %s:%d 个样板。", + "extendedae_plus.message.upload.quick_success": "✅ 样板快速上传成功!", + "extendedae_plus.message.upload.quick_fail": "❌ 样板快速上传失败,请检查供应器状态。", + "extendedae_plus.message.upload.client_fail": "❌ 客户端发送上传请求失败。", + "extendedae_plus.message.upload.invalid_item": "❌ 无效的样板物品。", + "extendedae_plus.message.provider.select_first": "请先选择一个样板供应器(点击 GroupHeader 旁的按钮)。", + "extendedae_plus.message.provider.location_missing": "未找到该供应器的位置信息,无法打开 UI。", + "extendedae_plus.message.provider.selected": "已选择样板供应器 (ID=%s),按住 Shift+左键可快速上传样板。", + "extendedae_plus.message.global_toggle_applied": "已对 %d 个供应器应用模式切换。", + "extendedae_plus.provider.unknown": "未知供应器", + "extendedae_plus.provider.named_id": "供应器 #%s", + "extendedae_plus.terminal.expattern": "ExtendedAE 样板终端", + "extendedae_plus.terminal.pattern_access": "AE2 样板访问终端", + "extendedae_plus.terminal.unknown": "未知终端", + "extendedae_plus.tooltip.provider.open_ui": "打开该供应器目标容器的界面", + "extendedae_plus.message.transceiver.bound": "已将收发器绑定至:%s", + "extendedae_plus.message.transceiver.card_unbound_use_self": "频道卡未绑定,已使用当前玩家。", + "extendedae_plus.message.transceiver.locked_change_channel": "收发器已锁定,无法修改频道。", + "extendedae_plus.message.transceiver.locked_toggle_mode": "收发器已锁定,无法切换模式。", + "extendedae_plus.message.transceiver.channel": "频道:%d", + "extendedae_plus.message.transceiver.mode_master": "模式:主端", + "extendedae_plus.message.transceiver.mode_slave": "模式:从端", + + "extendedae_plus.state.master": "主模式", + "extendedae_plus.state.slave": "从模式", + "extendedae_plus.state.locked": "已锁定", + "extendedae_plus.state.unlocked": "未锁定", + + "extendedae_plus.jade.master_named": "主节点:%s (%d, %d, %d)", + "extendedae_plus.jade.master_pos": "主节点位置:(%d, %d, %d)", + "extendedae_plus.jade.dimension": "维度:%s", + "extendedae_plus.jade.network.online": "设备在线", + "extendedae_plus.jade.network.offline": "设备离线", + + "extendedae_plus.screen.global_controller_title": "样板供应器状态控制器" } \ No newline at end of file