本地化处理

This commit is contained in:
GaLi 2025-12-22 17:55:50 +08:00
parent 145d57370b
commit 63494cfdf5
11 changed files with 201 additions and 71 deletions

View File

@ -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"

View File

@ -9,7 +9,7 @@ import net.minecraft.world.entity.player.Inventory;
import net.neoforged.neoforge.network.PacketDistributor;
public class GlobalProviderModesScreen extends AbstractContainerScreen<NetworkPatternControllerMenu> {
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;

View File

@ -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));
}
}

View File

@ -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);
}
}
}

View File

@ -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"));
}
}
},

View File

@ -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
);
}

View File

@ -121,7 +121,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
// 显示提示消息请先选择一个样板供应器
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<AEBaseMenu>
} 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<AEBaseMenu>
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<AEBaseMenu>
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);
}

View File

@ -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);
});
}

View File

@ -51,10 +51,9 @@ public class ExtendedAEPatternUploadUtil {
// --------------------------- 配置RecipeType 中文名称映射 ---------------------------
private static final String CONFIG_RELATIVE = "extendedae_plus/recipe_type_names.json";
private static final Map<ResourceLocation, String> CUSTOM_NAMES = new ConcurrentHashMap<>();
// 允许使用最终搜索关键字通常为 path 或自定义短语作为键例如"assembler": "组装机"
private static final Map<String, String> 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();
}
}

View File

@ -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"
}

View File

@ -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": "样板供应器状态控制器"
}