diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/block_name.yml b/bukkit/loader/src/main/resources/resources/default/configuration/block_name.yml new file mode 100644 index 000000000..0665394b7 --- /dev/null +++ b/bukkit/loader/src/main/resources/resources/default/configuration/block_name.yml @@ -0,0 +1,37 @@ +lang: + en_us: + block_name:default:chinese_lantern: "Chinese Lantern" + block_name:default:netherite_anvil: "Netherite Anvil" + block_name:default:topaz_ore: "Topaz Ore" + block_name:default:deepslate_topaz_ore: "Deepslate Topaz Ore" + block_name:default:palm_log: "Palm Log" + block_name:default:stripped_palm_log: "Stripped Palm Log" + block_name:default:palm_wood: "Palm Wood" + block_name:default:stripped_palm_wood: "Stripped Palm Wood" + block_name:default:palm_planks: "Palm Planks" + block_name:default:palm_sapling: "Palm Sapling" + block_name:default:palm_leaves: "Palm Leaves" + block_name:default:fairy_flower: "Fairy Flower" + block_name:default:reed: "Reed" + block_name:default:flame_cane: "Flame Cane" + block_name:default:ender_pearl_flower: "Ender Pearl Flower" + block_name:default:gunpowder_block: "GunPowder Block" + block_name:default:solid_gunpowder_block: "Solid GunPowder Block" + zh_cn: + block_name:default:chinese_lantern: "灯笼" + block_name:default:netherite_anvil: "下界合金砧" + block_name:default:topaz_ore: "黄玉矿石" + block_name:default:deepslate_topaz_ore: "深层黄玉矿石" + block_name:default:palm_log: "棕榈原木" + block_name:default:stripped_palm_log: "去皮棕榈原木" + block_name:default:palm_wood: "棕榈木" + block_name:default:stripped_palm_wood: "去皮棕榈木" + block_name:default:palm_planks: "棕榈木板" + block_name:default:palm_sapling: "棕榈树苗" + block_name:default:palm_leaves: "棕榈树叶" + block_name:default:fairy_flower: "仙灵花" + block_name:default:reed: "芦苇" + block_name:default:flame_cane: "烈焰甘蔗" + block_name:default:ender_pearl_flower: "末影珍珠花" + block_name:default:gunpowder_block: "火药粉末" + block_name:default:solid_gunpowder_block: "凝固火药块" \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java index febcbe746..2c2610ee9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java @@ -1,14 +1,19 @@ package net.momirealms.craftengine.core.plugin.locale; +import net.momirealms.craftengine.core.block.BlockStateParser; +import net.momirealms.craftengine.core.block.BlockStateVariantProvider; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; public class I18NData { public final Map translations = new HashMap<>(); public void addTranslations(Map data) { + addBlockName(data); translations.putAll(data); } @@ -36,4 +41,51 @@ public class I18NData { }); }); } -} \ No newline at end of file + + private static void addBlockName(Map data) { + String[] keyBuffer = new String[data.size()]; + int validKeyCount = 0; + for (Map.Entry entry : data.entrySet()) { + String key = entry.getKey(); + if (key != null && key.length() > 11 && key.startsWith("block_name:")) { + keyBuffer[validKeyCount++] = key; + } + } + + for (String key : keyBuffer) { + String value = data.remove(key); + ImmutableBlockState states = BlockStateParser.deserialize(key.substring(11)); + if (states == null) continue; + + BlockStateVariantProvider variantProvider = states.owner().value().variantProvider(); + Collection stateCollection = variantProvider.states(); + for (ImmutableBlockState state : stateCollection) { + Object blockState = state.customBlockState().handle(); + String id = blockState.toString(); + int first = -1, last = -1; + for (int i = 0; i < id.length(); i++) { + char c = id.charAt(i); + if (c == '{' && first == -1) { + first = i; + } else if (c == '}') { + last = i; + } + } + if (first == -1 || last == -1 || last <= first) { + CraftEngine.instance().logger().warn("Invalid block ID format: " + id); + continue; + } + int length = last - first - 1; + char[] chars = new char[length]; + id.getChars(first + 1, last, chars, 0); + for (int i = 0; i < length; i++) { + if (chars[i] == ':') { + chars[i] = '.'; + } + } + String blockId = new String(chars); + data.put("block." + blockId, value); + } + } + } +}