/*
 *  Copyright 2025-2026 R3944Realms
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package top.r3944realms.eroticdungeongame.datagen.value;

import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.Unmodifiable;
import top.r3944realms.eroticdungeongame.EroticDungeon;
import top.r3944realms.eroticdungeongame.content.block.type.*;
import top.r3944realms.eroticdungeongame.core.register.EDGBlocks;
import top.r3944realms.eroticdungeongame.core.register.EDGItems;
import top.r3944realms.eroticdungeongame.core.register.EDGSoundEvents;
import top.r3944realms.eroticdungeongame.util.ColorContent;
import top.r3944realms.eroticdungeongame.util.WoodTypeHelper;
import top.r3944realms.lib39.datagen.value.ILangKeyValue;
import top.r3944realms.lib39.datagen.value.ILangKeyValueCollection;
import top.r3944realms.lib39.datagen.value.LangKeyValue;
import top.r3944realms.lib39.datagen.value.ModPartEnum;
import top.r3944realms.lib39.util.lang.Pair;
import top.r3944realms.lib39.util.lang.Tuple;

import java.util.ArrayList;
import java.util.List;

public enum EDGLangKey implements ILangKeyValueCollection {
    INSTANCE;
    /**
     * The Lang key values.
     */
    final List<LangKeyValue> langKeyValues = new ArrayList<>();
    EDGLangKey () {
        initLangKeyValues();
    }

    public void initLangKeyValues() {
        initKey();
        initEntityKeyValues();
        initBlockAndBlockItemLangKeyValues();
    }

    private void initKey() {
        LangKeyValue mod = LangKeyValue.ofKey(EroticDungeon.MOD_ID + ".name", ModPartEnum.DEFAULT,
                "Erotic Dungeon", "地牢游戏", "地牢游戲", "牢戯"
        );
        addLang(
                mod
        );
        addLang(
                LangKeyValue.ofSupplier(EDGItems.WHIP, ModPartEnum.ITEM,
                        "Whip", "鞭子", "鞭子", "鞭"
                )
        );
        addLang(
                LangKeyValue.ofKey(EDGSoundEvents.getSubTitleTranslateKey("lock"), ModPartEnum.SOUND,
                        "Lock", "上锁", "上鎖", "鎖"
                )
        );
        addLang(
                LangKeyValue.ofKey(EDGSoundEvents.getSubTitleTranslateKey("unlock"), ModPartEnum.SOUND,
                        "Unlock", "解锁", "解鎖", "解"
                )
        );
        addLang(
                LangKeyValue.ofKey(EDGSoundEvents.getSubTitleTranslateKey("whip"), ModPartEnum.SOUND,
                        "Whip Hit", "鞭子击打", "鞭子擊打", "鞭擊"
                )
        );
        addLang(
                LangKeyValue.ofKey(EDGSoundEvents.getSubTitleTranslateKey("in"), ModPartEnum.SOUND,
                        "Piston Sound", "活塞声", "活塞聲", "塞聲"
                )
        );
        addLang(
                LangKeyValue.ofKey(EDGSoundEvents.getSubTitleTranslateKey("out"), ModPartEnum.SOUND,
                        "Piston Sound", "活塞声", "活塞聲", "塞聲"
                )
        );
        addLang(
                LangKeyValue.ofKey(ModPartEnum.ENCHANTMENT.getFullKey(EroticDungeon.MOD_ID, "carrot_and_stick"), ModPartEnum.ENCHANTMENT,
                        "Carrot And Stick", "恩威并施", "恩威並施", "恩威並施"
                )
        );
        LangKeyValue dungeonTable = LangKeyValue.ofSupplier(EDGBlocks.DUNGEON_CRAFTING_TABLE, ModPartEnum.BLOCK,
                "Dungeon Crafting Table", "地牢工作台", "地牢工作台", "牢戯製物案"
        );


       addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "love_machine"), ModPartEnum.MESSAGE,
               "Right click with a feather to adjust settings",
               "使用羽毛右键方块来调整设置",
               "使用羽毛右鍵方塊來調整設置",
               "以羽右擊方石，可調其設"
        ));
        addLang(LangKeyValue.ofKey("eroticdungeongame.message.quit.failed.locked", ModPartEnum.MESSAGE,
                "Failed to unride the device / release player: this device is locked",
                "退出设备 / 或释放玩家失敗：设备已上锁",
                "退出設備 / 或釋放玩家失敗：设备已上鎖",
                "离机 / 釋人未遂：已鎖"
        ));
        addLang(LangKeyValue.ofKey("eroticdungeongame.message.key.success.locked", ModPartEnum.MESSAGE,
                "Successfully locked the device",
                "成功锁定设备",
                "成功鎖定設備",
                "機關已閉"
        ));

        addLang(LangKeyValue.ofKey("eroticdungeongame.message.key.failed.mismatch", ModPartEnum.MESSAGE,
                "This key is mismatched with the current device",
                "此钥匙与当前设备不匹配",
                "此鑰匙與當前設備不匹配",
                "鑰機不契"
        ));
        addLang(LangKeyValue.ofSupplier(EDGItems.DEVICE_KEY, ModPartEnum.ITEM,
                "Device Key",
                "设备钥匙",
                "設備鑰匙",
                "机钥"
        ));
        addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "dungeon_key_01"), ModPartEnum.MESSAGE,
                "Hold key in main hand and Right Click to lock the corresponding device",
                "主手持有钥匙右键锁定对应设备",
                "主手持有鑰匙右鍵鎖定對應設備",
                "主手持鑰，右擊，可鎖對應之機"
        ));
        addLang(LangKeyValue.ofKey(
                ModPartEnum.DESCRIPTION.getFullKey(EroticDungeon.MOD_ID, "key_content"),ModPartEnum.DESCRIPTION,
                "Device Key: ",
                "设备钥匙: ",
                "設備鑰匙: ",
                "机钥: "
        ));

        addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "dungeon_key_02"), ModPartEnum.MESSAGE,
                "Hold key in main hand and Right Click to lock or unlock the corresponding device",
                "主手持有钥匙右键锁定或解锁对应设备",
                "主手持有鑰匙右鍵鎖定解鎖對應設備",
                "主手持鑰，右擊，可鎖啓對應之機"
        ));

        addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "dungeon_key_03"), ModPartEnum.MESSAGE,
                "Hold key in main hand and press designated key to exit device/release player",
                "主手持有钥匙按下指定按键即可退出设备/或释放玩家",
                "主手持有鑰匙按下指定按鍵即可退出設備/或釋放玩家",
                "主手持鑰，按定鍵，可離開機/釋人"
        ));

        addLang(LangKeyValue.ofKey("eroticdungeongame.message.key.success.unlock", ModPartEnum.MESSAGE,
                "Successfully unlocked the device",
                "成功解锁设备",
                "成功解鎖設備",
                "機關已啓"
        ));
        addLang(LangKeyValue.ofKey("key.eroticdungeongame.quit", ModPartEnum.MESSAGE,
                "Unride the device/ Release player",
                "退出设备 / 释放玩家",
                "退出设备 / 釋放玩家",
                "离机 / 釋人"
        ));
        addLang(LangKeyValue.ofKey("key.eroticdungeongame.bind", ModPartEnum.MESSAGE,
                "Bind player to device",
                "将玩家绑定在设备上",
                "將玩家綁定在設備上",
                "綁至設備"
        ));
        addLang(LangKeyValue.ofKey(
                "mount.eroticdungeongame.seat.onboard", ModPartEnum.MESSAGE,
                "Press %s to Exit",
                "按%s离开",
                "按%s離開",
                "按%s離開"
        ));
        addLang(LangKeyValue.copyOf("key.categories.eroticdungeongame", ModPartEnum.MESSAGE,
            mod
        ));

        addLang(
                LangKeyValue.ofKey("stat."+ EroticDungeon.MOD_ID + ".interact_with_dungeon_crafting_table", ModPartEnum.DESCRIPTION,
                        "Interactions with Dungeon Crafting Table", "与地牢工作台交互", "與地牢工作台交互", "操持地牢造物案"
                )
        );
        addLang(
                LangKeyValue.copyOf(EDGItems.DUNGEON_CRAFTING_TABLE, ModPartEnum.ITEM,
                        dungeonTable
                )
        );
        LangKeyValue loveMachine = LangKeyValue.ofSupplier(EDGBlocks.END_ROD_LOVE_MACHINE, ModPartEnum.BLOCK,
                "Love Machine", "爱机", "愛機", "戲械"
        );
        addLang(loveMachine);
        addLang(LangKeyValue.copyOf(EDGBlocks.LIGHTNING_ROD_LOVE_MACHINE, ModPartEnum.BLOCK,
                loveMachine
        ));
        addLang(
                LangKeyValue.copyOf(EDGItems.END_ROD_LOVE_MACHINE, ModPartEnum.ITEM,
                        loveMachine
                )
        );
        addLang(LangKeyValue.copyOf(EDGItems.LIGHTNING_ROD_LOVE_MACHINE, ModPartEnum.ITEM,
                loveMachine
        ));
        addLang(
                LangKeyValue.copyOf(ModPartEnum.CONTAINER.getFullKey(EroticDungeon.MOD_ID, "crafting_table"), ModPartEnum.CONTAINER,
                        dungeonTable
                )
        );
        addLang(
                LangKeyValue.copyOf("emi.category." + EroticDungeon.MOD_ID + ".dungeon_crafting_table", ModPartEnum.TITLE,
                        dungeonTable
                )
        );
        addLang(
                LangKeyValue.ofKey("entity.minecraft.villager." + EroticDungeon.MOD_ID + ".dungeon_craftsman", ModPartEnum.ENTITY,
                        "Dungeon Craftsman", "地牢工匠", "地牢工匠" ,"牢戯匠"
                )
        );
        // 偏移配置 GUI 翻译
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.title", ModPartEnum.GUI,
                        "Offset Configuration", "偏移设置", "偏移設置", "偏移設定"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.speed", ModPartEnum.GUI,
                        "Speed", "速度", "速度", "速度"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.offset_x", ModPartEnum.GUI,
                        "Offset X", "X轴偏移", "X軸偏移", "X軸偏移"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.offset_y", ModPartEnum.GUI,
                        "Offset Y", "Y轴偏移", "Y軸偏移", "Y軸偏移"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.offset_z", ModPartEnum.GUI,
                        "Offset Z", "Z轴偏移", "Z軸偏移", "Z軸偏移"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.enable_offset", ModPartEnum.GUI,
                        "Enable Offset", "启用偏移", "啟用偏移", "啟用偏移"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.apply", ModPartEnum.GUI,
                        "Apply", "应用", "應用", "應用"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.reset", ModPartEnum.GUI,
                        "Reset", "重置", "重置", "重置"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_config.close", ModPartEnum.GUI,
                        "Close", "关闭", "關閉", "關閉"
                )
        );

        // 偏移配置工具提示
        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeon.love_machine.config", ModPartEnum.MESSAGE,
                        "Sneak + Right-click to configure offset", "潜行+右键配置偏移", "潛行+右鍵配置偏移", "潛行+右鍵配置偏移"
                )
        );

        // 偏移配置消息
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.hint", ModPartEnum.MESSAGE,
                        "Drag to rotate 3D view", "拖拽旋转3D视角", "拖拽旋轉3D視角", "拖拽旋轉3D視角"
                )
        );
        addLang(
                LangKeyValue.ofKey("message.eroticdungeon.config_saved", ModPartEnum.MESSAGE,
                        "Offset configuration saved", "偏移设置已保存", "偏移設置已保存", "偏移設定已保存"
                )
        );
        addLang(
                LangKeyValue.ofKey("message.eroticdungeon.config_reset", ModPartEnum.MESSAGE,
                        "Offset configuration reset to default", "偏移设置已重置为默认", "偏移設置已重置為預設", "偏移設定已重置為預設"
                )
        );

        // 偏移范围提示
        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeon.offset_range", ModPartEnum.MESSAGE,
                        "Range: 0.0 - 1.0", "范围: 0.0 - 1.0", "範圍: 0.0 - 1.0", "範圍: 0.0 - 1.0"
                )
        );
        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeon.speed_range", ModPartEnum.MESSAGE,
                        "Range: 0.001 - 0.1", "范围: 0.001 - 0.1", "範圍: 0.001 - 0.1", "範圍: 0.001 - 0.1"
                )
        );

        // 偏移模式
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_mode.linear", ModPartEnum.GUI,
                        "Linear", "线性", "線性", "線性"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_mode.sine", ModPartEnum.GUI,
                        "Sine Wave", "正弦波", "正弦波", "正弦波"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_mode.circular", ModPartEnum.GUI,
                        "Circular", "圆形", "圓形", "圓形"
                )
        );

        // 偏移方向
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_direction.forward", ModPartEnum.GUI,
                        "Forward", "向前", "向前", "向前"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_direction.backward", ModPartEnum.GUI,
                        "Backward", "向后", "向後", "向後"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.offset_direction.bidirectional", ModPartEnum.GUI,
                        "Bidirectional", "双向", "雙向", "雙向"
                )
        );
// 状态指示
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.status.enabled", ModPartEnum.GUI,
                        "Enabled", "已启用", "已啟用", "已啟用"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.status.disabled", ModPartEnum.GUI,
                        "Disabled", "已禁用", "已禁用", "已禁用"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.status.active", ModPartEnum.GUI,
                        "Active", "激活", "激活", "激活"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.status.inactive", ModPartEnum.GUI,
                        "Inactive", "未激活", "未激活", "未激活"
                )
        );
        // 预览标签
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview", ModPartEnum.GUI,
                        "Preview", "预览", "預覽", "預覽"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_left", ModPartEnum.GUI,
                        "Rotate Left", "左旋转", "左旋轉", "左旋轉"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_right", ModPartEnum.GUI,
                        "Rotate Right", "右旋转", "右旋轉", "右旋轉"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_up", ModPartEnum.GUI,
                        "Rotate Up", "上旋转", "上旋轉", "上旋轉"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_down", ModPartEnum.GUI,
                        "Rotate Down", "下旋转", "下旋轉", "下旋轉"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.reset_view", ModPartEnum.GUI,
                        "Reset View", "重置视角", "重置視角", "重置視角"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.zoom_in", ModPartEnum.GUI,
                        "Zoom In", "放大", "放大", "放大"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.zoom_out", ModPartEnum.GUI,
                        "Zoom Out", "缩小", "縮小", "縮小"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.toggle_grid", ModPartEnum.GUI,
                        "Toggle Grid", "切换网格", "切換網格", "切換網格"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.toggle_axes", ModPartEnum.GUI,
                        "Toggle Axes", "切换坐标轴", "切換座標軸", "切換座標軸"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.toggle_planes", ModPartEnum.GUI,
                        "Toggle Planes", "切换平面", "切換平面", "切換平面"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_top", ModPartEnum.GUI,
                        "Top View", "顶视图", "頂視圖", "頂視圖"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_front", ModPartEnum.GUI,
                        "Front View", "前视图", "前視圖", "前視圖"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_side", ModPartEnum.GUI,
                        "Side View", "侧视图", "側視圖", "側視圖"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_iso", ModPartEnum.GUI,
                        "Isometric View", "等轴测图", "等軸測圖", "等軸測圖"
                )
        );
        // 坐标轴标签
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.axis.x", ModPartEnum.GUI,
                        "X", "X轴", "X軸", "X軸"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.axis.y", ModPartEnum.GUI,
                        "Y", "Y轴", "Y軸", "Y軸"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.axis.z", ModPartEnum.GUI,
                        "Z", "Z轴", "Z軸", "Z軸"
                )
        );

// 方向指示
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.direction.positive", ModPartEnum.GUI,
                        "+", "+方向", "+方向", "+方向"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.direction.negative", ModPartEnum.GUI,
                        "-", "-方向", "-方向", "-方向"
                )
        );

// 预览相关
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.3d_preview", ModPartEnum.GUI,
                        "3D Preview", "3D预览", "3D預覽", "3D預覽"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.preview.coordinates", ModPartEnum.GUI,
                        "Coordinates", "坐标", "座標", "座標"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.slider.min", ModPartEnum.MESSAGE,
                        "Minimum", "最小值", "最小值", "最小值"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.slider.max", ModPartEnum.MESSAGE,
                        "Maximum", "最大值", "最大值", "最大值"
                )
        );
        addLang(
                LangKeyValue.ofKey("gui.eroticdungeon.slider.default", ModPartEnum.MESSAGE,
                        "Default", "默认值", "預設值", "預設值"
                )
        );

        // 输入验证消息
        addLang(
                LangKeyValue.ofKey("message.eroticdungeon.invalid_value", ModPartEnum.MESSAGE,
                        "Invalid value. Please enter a number between %s and %s",
                        "无效值。请输入 %s 到 %s 之间的数字",
                        "無效值。請輸入 %s 到 %s 之間的數字",
                        "無效值。請輸入 %s 到 %s 之間的數字"
                )
        );
        addLang(
                LangKeyValue.ofKey("death.attack.fucked_0", ModPartEnum.MESSAGE,
                        "%s was fucked to die",
                        "%s 被艹死了",
                        "%s 被艹死了",
                        "%s 尋歡卒"
                )
        );
        addLang(
                LangKeyValue.ofKey("death.attack.fucked_1", ModPartEnum.MESSAGE,
                        "%s was killed by being stabbed",
                        "%s 被插死了",
                        "%s 被插死了",
                        "%s 極樂卒"
                )
        );
        addLang(
                LangKeyValue.ofKey("death.attack.fucked_0.entity", ModPartEnum.MESSAGE,
                        "%s was fucked to die by %s",
                        "%s 被 %s 艹死了",
                        "%s 被 %s 艹死了",
                        "%s 與 %s 尋歡卒"
                )
        );
        addLang(
                LangKeyValue.ofKey("death.attack.fucked_1.entity", ModPartEnum.MESSAGE,
                        "%s was killed by being stabbed with %s",
                        "%s 被 %s 插死了",
                        "%s 被 %s 插死了",
                        "%s 與 %s 極樂卒"
                )
        );
        addLang(
                LangKeyValue.ofKey("death.attack.whip_0", ModPartEnum.MESSAGE,
                        "%s was whipped to death",
                        "%s 被鞭打致死",
                        "%s 被鞭打致死",
                        "%s 鞭刑卒"
                )
        );

        addLang(
                LangKeyValue.ofKey("death.attack.whip_1", ModPartEnum.MESSAGE,
                        "%s couldn't survive the whipping",
                        "%s 没能承受住鞭刑",
                        "%s 沒能承受住鞭刑",
                        "%s 鞭責卒"
                )
        );

        addLang(
                LangKeyValue.ofKey("death.attack.whip_2", ModPartEnum.MESSAGE,
                        "%s collapsed under the lash",
                        "%s 倒在了鞭下",
                        "%s 倒在了鞭下",
                        "%s 鞭下卒"
                )
        );
        addLang(
                LangKeyValue.ofKey("death.attack.whip_0.entity", ModPartEnum.MESSAGE,
                        "%s was whipped to death by %s",
                        "%s 被 %s 鞭打致死",
                        "%s 被 %s 鞭打致死",
                        "%s 與 %s 鞭刑卒"
                )
        );

        addLang(
                LangKeyValue.ofKey("death.attack.whip_1.entity", ModPartEnum.MESSAGE,
                        "%s was mercilessly whipped by %s",
                        "%s 被 %s 無情地鞭打致死",
                        "%s 被 %s 無情地鞭打致死",
                        "%s 與 %s 苛責卒"
                )
        );

        addLang(
                LangKeyValue.ofKey("death.attack.whip_2.entity", ModPartEnum.MESSAGE,
                        "%s collapsed under %s's whip",
                        "%s 倒在了 %s 的鞭下",
                        "%s 倒在了 %s 的鞭下",
                        "%s 與 %s 鞭下卒"
                )
        );
        // ============ 设备绑定命令 ============
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.bind.pos", ModPartEnum.COMMAND,
                        "Bound %s to device at %s",
                        "已将 %s 绑定在位于 %s 处的设备上",
                        "已將 %s 綁定在位於 %s 處的設備上",
                        "%s 綁定於 %s 設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.bind.pos.self", ModPartEnum.COMMAND,
                        "Bound yourself to device at %s",
                        "已将自己绑定在位于 %s 处的设备上",
                        "已將自己綁定在位於 %s 處的設備上",
                        "自綁於 %s 設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.bind.pos.with_code", ModPartEnum.COMMAND,
                        "Bound %s to device at %s with code %s",
                        "已将 %s 绑定在位于 %s 处的设备上, 并上锁(%s)",
                        "已將 %s 綁定在位於 %s 處的設備上, 並上鎖(%s)",
                        "%s 綁定於 %s 設備並上鎖(%s)"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.bind.pos.self.with_code", ModPartEnum.COMMAND,
                        "Bound yourself to device at %s with code %s",
                        "已将自己绑定在位于 %s 处的设备上, 并上锁(%s)",
                        "已將自己綁定在位於 %s 處的設備上, 並上鎖(%s)",
                        "自綁於 %s 設備並上鎖(%s)"
                )
        );

        // ============ 设备解绑命令 ============
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unbind.self.success", ModPartEnum.COMMAND,
                        "Successfully unbound yourself from all devices",
                        "已成功解绑自己的所有设备",
                        "已成功解綁自己的所有設備",
                        "自解設備成功"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unbind.self.fail", ModPartEnum.COMMAND,
                        "Failed to unbind yourself from devices",
                        "解绑自己的设备失败",
                        "解綁自己的設備失敗",
                        "自解設備失敗"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unbind.pos.success", ModPartEnum.COMMAND,
                        "Successfully unbound device at %s",
                        "已成功解绑位于 %s 处的设备",
                        "已成功解綁位於 %s 處的設備",
                        "設備 %s 解綁成功"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unbind.pos.fail", ModPartEnum.COMMAND,
                        "Failed to unbind device at %s",
                        "解绑位于 %s 处的设备失败",
                        "解綁位於 %s 處的設備失敗",
                        "設備 %s 解綁失敗"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unbind.player.success", ModPartEnum.COMMAND,
                        "Successfully unbound player %s from all devices",
                        "已成功解绑玩家 %s 的所有设备",
                        "已成功解綁玩家 %s 的所有設備",
                        "玩家 %s 設備解綁成功"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unbind.player.fail", ModPartEnum.COMMAND,
                        "Failed to unbind player %s from devices",
                        "解绑玩家 %s 的设备失败",
                        "解綁玩家 %s 的設備失敗",
                        "玩家 %s 設備解綁失敗"
                )
        );

        // ============ 设备上锁命令 ============
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.lock.self.success", ModPartEnum.COMMAND,
                        "Successfully locked your current device with code %s",
                        "已成功为您当前的设备上锁，密码 %s",
                        "已成功為您當前的設備上鎖，密碼 %s",
                        "當前設備上鎖成功 %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.lock.self.fail", ModPartEnum.COMMAND,
                        "Failed to lock your current device",
                        "为您当前的设备上锁失败",
                        "為您當前的設備上鎖失敗",
                        "當前設備上鎖失敗"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.lock.pos.success", ModPartEnum.COMMAND,
                        "Successfully locked device at %s with code %s",
                        "已成功为位于 %s 的设备上锁，密码 %s",
                        "已成功為位於 %s 的設備上鎖，密碼 %s",
                        "設備 %s 上鎖成功 %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.lock.pos.fail", ModPartEnum.COMMAND,
                        "Failed to lock device at %s",
                        "给位于 %s 的设备上锁失败",
                        "給位於 %s 的設備上鎖失敗",
                        "設備 %s 上鎖失敗"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.lock.player.success", ModPartEnum.COMMAND,
                        "Successfully locked device for player %s with code %s",
                        "已成功为玩家 %s 的设备上锁，密码 %s",
                        "已成功為玩家 %s 的設備上鎖，密碼 %s",
                        "玩家 %s 設備上鎖成功 %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.lock.player.fail", ModPartEnum.COMMAND,
                        "Failed to lock device for player %s",
                        "给玩家 %s 的设备上锁失败",
                        "給玩家 %s 的設備上鎖失敗",
                        "玩家 %s 設備上鎖失敗"
                )
        );

        // ============ 设备解锁命令 ============
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unlock.self.success", ModPartEnum.COMMAND,
                        "Successfully unlocked your current device",
                        "已成功为您当前的设备解锁",
                        "已成功為您當前的設備解鎖",
                        "當前設備解鎖成功"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unlock.self.fail", ModPartEnum.COMMAND,
                        "Failed to unlock your current device",
                        "为您当前的设备解锁失败",
                        "為您當前的設備解鎖失敗",
                        "當前設備解鎖失敗"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unlock.pos.success", ModPartEnum.COMMAND,
                        "Successfully unlocked device at %s",
                        "已成功为位于 %s 的设备解锁",
                        "已成功為位於 %s 的設備解鎖",
                        "設備 %s 解鎖成功"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unlock.pos.fail", ModPartEnum.COMMAND,
                        "Failed to unlock device at %s",
                        "给位于 %s 的设备解锁失败",
                        "給位於 %s 的設備解鎖失敗",
                        "設備 %s 解鎖失敗"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unlock.player.success", ModPartEnum.COMMAND,
                        "Successfully unlocked device for player %s",
                        "已成功为玩家 %s 的设备解锁",
                        "已成功為玩家 %s 的設備解鎖",
                        "玩家 %s 設備解鎖成功"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.unlock.player.fail", ModPartEnum.COMMAND,
                        "Failed to unlock device for player %s",
                        "给玩家 %s 的设备解锁失败",
                        "給玩家 %s 的設備解鎖失敗",
                        "玩家 %s 設備解鎖失敗"
                )
        );

        // ============ 钥匙命令 ============
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.key.lock.set.success", ModPartEnum.COMMAND,
                        "Successfully set key code to %s",
                        "已成功将钥匙密码设置为 %s",
                        "已成功將鑰匙密碼設置為 %s",
                        "鑰匙密碼設定成功 %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.key.lock.set.fail", ModPartEnum.COMMAND,
                        "Failed to set key code - You must hold a key in your main hand",
                        "设置钥匙密码失败 - 你必须在主手持有钥匙",
                        "設置鑰匙密碼失敗 - 你必須在主手持有鑰匙",
                        "鑰匙密碼設定失敗 - 需手持鑰匙"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.key.lock.clear.success", ModPartEnum.COMMAND,
                        "Successfully cleared key code",
                        "已成功清除钥匙密码",
                        "已成功清除鑰匙密碼",
                        "鑰匙密碼清除成功"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.key.lock.clear.fail", ModPartEnum.COMMAND,
                        "Failed to clear key code - You must hold a key in your main hand",
                        "清除钥匙密码失败 - 你必须在主手持有钥匙",
                        "清除鑰匙密碼失敗 - 你必須在主手持有鑰匙",
                        "鑰匙密碼清除失敗 - 需手持鑰匙"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.key.lock.get.success", ModPartEnum.COMMAND,
                        "Current key code: %s",
                        "当前钥匙密码: %s",
                        "當前鑰匙密碼: %s",
                        "當前鑰匙密碼: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.key.lock.get.empty", ModPartEnum.COMMAND,
                        "This key has no code set",
                        "这把钥匙没有设置密码",
                        "這把鑰匙沒有設置密碼",
                        "此鑰匙無密碼"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.key.lock.get.fail", ModPartEnum.COMMAND,
                        "Failed to get key code - You must hold a key in your main hand",
                        "获取钥匙密码失败 - 你必须在主手持有钥匙",
                        "獲取鑰匙密碼失敗 - 你必須在主手持有鑰匙",
                        "鑰匙密碼獲取失敗 - 需手持鑰匙"
                )
        );

        // ============ 设备错误信息 ============
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.fail.not_found_device", ModPartEnum.COMMAND,
                        "No device found at %s",
                        "未在 %s 处找到设备",
                        "未在 %s 處找到設備",
                        "%s 無設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.fail.device_is_occupied", ModPartEnum.COMMAND,
                        "Device at %s is already occupied",
                        "%s 处设备已被占用",
                        "%s 處設備已被佔用",
                        "設備 %s 已佔用"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.fail.in_other_device", ModPartEnum.COMMAND,
                        "Another device at %1$s is occupied device by player %2$s, please release first",
                        "玩家 %2$s 已占用另一处位于 %1$s 的设备上，请先释放",
                        "玩家 %2$s 已佔用另一處位於 %1$s 的設備上，請先釋放",
                        "設備 %1$s 已為%2$s佔用之，請釋之"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.device.fail.unknown", ModPartEnum.COMMAND,
                        "Unknown device error occurred",
                        "设备未知错误",
                        "設備未知錯誤",
                        "設備未知錯誤"
                )
        );

        // ============ 描述性文本 ============
        addLang(
                LangKeyValue.ofKey("description.eroticdungeongame.click_to_teleport", ModPartEnum.INFO,
                        "Click to teleport to this location",
                        "点击传送至此位置",
                        "點擊傳送至至此位置",
                        "點擊傳送"
                )
        );

        addLang(
                LangKeyValue.ofKey("description.eroticdungeongame.click_to_copy", ModPartEnum.INFO,
                        "Click to copy code to clipboard",
                        "点击复制密码到剪贴板",
                        "點擊複製密碼到剪貼板",
                        "點擊複製密碼"
                )
        );

        // ============ 命令帮助信息 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device", ModPartEnum.COMMAND,
                        "Device management commands",
                        "设备管理命令",
                        "設備管理命令",
                        "設備管理指令"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.key", ModPartEnum.COMMAND,
                        "Key management commands",
                        "钥匙管理命令",
                        "鑰匙管理命令",
                        "鑰匙管理指令"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.bind", ModPartEnum.COMMAND,
                        "Bind a player to a device",
                        "将玩家绑定到设备",
                        "將玩家綁定到設備",
                        "綁定玩家至設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unbind", ModPartEnum.COMMAND,
                        "Unbind a player or device",
                        "解绑玩家或设备",
                        "解綁玩家或設備",
                        "解綁玩家或設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.lock", ModPartEnum.COMMAND,
                        "Lock a device with a code",
                        "为设备上锁",
                        "為設備上鎖",
                        "設備上鎖"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unlock", ModPartEnum.COMMAND,
                        "Unlock a device",
                        "为设备解锁",
                        "為設備解鎖",
                        "設備解鎖"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.help.key.set", ModPartEnum.COMMAND,
                        "Set a code for the held key",
                        "为手中的钥匙设置密码",
                        "為手中的鑰匙設置密碼",
                        "設置鑰匙密碼"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.help.key.get", ModPartEnum.COMMAND,
                        "Get the code of the held key",
                        "获取手中钥匙的密码",
                        "獲取手中鑰匙的密碼",
                        "獲取鑰匙密碼"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.help.key.clear", ModPartEnum.COMMAND,
                        "Clear the code of the held key",
                        "清除手中钥匙的密码",
                        "清除手中鑰匙的密碼",
                        "清除鑰匙密碼"
                )
        );
        // ============ 命令根节点 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.root", ModPartEnum.COMMAND,
                        "Erotic Dungeon Game Commands",
                        "地牢游戏命令",
                        "地牢遊戲指令",
                        "地牢遊戲指令"
                )
        );

        // ============ 设备命令组 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device", ModPartEnum.COMMAND,
                        "Device management commands",
                        "设备管理命令",
                        "設備管理指令",
                        "設備管理指令"
                )
        );

        // ============ Bind 命令 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.bind", ModPartEnum.COMMAND,
                        "Bind a player to a device",
                        "将玩家绑定到设备",
                        "將玩家綁定到設備",
                        "綁定玩家至設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.bind.pos.desc", ModPartEnum.COMMAND,
                        "Position of the device",
                        "设备的位置坐标",
                        "設備的位置座標",
                        "設備座標"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.bind.player.desc", ModPartEnum.COMMAND,
                        "Player to bind (default: yourself)",
                        "要绑定的玩家（默认为自己）",
                        "要綁定的玩家（預設為自己）",
                        "綁定玩家（預設自身）"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.bind.code.desc", ModPartEnum.COMMAND,
                        "Lock code (optional)",
                        "锁密码（可选）",
                        "鎖密碼（可選）",
                        "鎖密碼（可選）"
                )
        );

        // ============ Unbind 命令 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unbind", ModPartEnum.COMMAND,
                        "Unbind a player or device",
                        "解绑玩家或设备",
                        "解綁玩家或設備",
                        "解綁玩家或設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unbind.pos.desc", ModPartEnum.COMMAND,
                        "Position of the device to unbind",
                        "要解绑的设备位置",
                        "要解綁的設備位置",
                        "解綁設備位置"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unbind.player.desc", ModPartEnum.COMMAND,
                        "Player to unbind from devices",
                        "要解绑的玩家",
                        "要解綁的玩家",
                        "解綁玩家"
                )
        );

        // ============ Lock 命令 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.lock", ModPartEnum.COMMAND,
                        "Lock a device",
                        "为设备上锁",
                        "為設備上鎖",
                        "設備上鎖"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.lock.pos.desc", ModPartEnum.COMMAND,
                        "Position of the device to lock",
                        "要上锁的设备位置",
                        "要上鎖的設備位置",
                        "上鎖設備位置"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.lock.player.desc", ModPartEnum.COMMAND,
                        "Player whose device to lock",
                        "要为其设备上锁的玩家",
                        "要為其設備上鎖的玩家",
                        "玩家設備上鎖"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.lock.code.desc", ModPartEnum.COMMAND,
                        "Lock code (random if not specified)",
                        "锁密码（不指定则随机生成）",
                        "鎖密碼（不指定則隨機生成）",
                        "鎖密碼（未指定則隨機）"
                )
        );

        // ============ Unlock 命令 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unlock", ModPartEnum.COMMAND,
                        "Unlock a device",
                        "为设备解锁",
                        "為設備解鎖",
                        "設備解鎖"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unlock.pos.desc", ModPartEnum.COMMAND,
                        "Position of the device to unlock",
                        "要解锁的设备位置",
                        "要解鎖的設備位置",
                        "解鎖設備位置"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.device.unlock.player.desc", ModPartEnum.COMMAND,
                        "Player whose device to unlock",
                        "要为其设备解锁的玩家",
                        "要為其設備解鎖的玩家",
                        "玩家設備解鎖"
                )
        );

        // ============ Key 命令组 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.key", ModPartEnum.COMMAND,
                        "Key management commands.help",
                        "钥匙管理命令",
                        "鑰匙管理指令",
                        "鑰匙管理指令"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.key.lock", ModPartEnum.COMMAND,
                        "Key lock management",
                        "钥匙密码管理",
                        "鑰匙密碼管理",
                        "鑰匙密碼管理"
                )
        );

        // ============ Key Set 命令 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.key.lock.set", ModPartEnum.COMMAND,
                        "Set a code for the held key",
                        "为手中的钥匙设置密码",
                        "為手中的鑰匙設置密碼",
                        "設置鑰匙密碼"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.key.lock.set.code.desc", ModPartEnum.COMMAND,
                        "Lock code (random if not specified)",
                        "锁密码（不指定则随机生成）",
                        "鎖密碼（不指定則隨機生成）",
                        "鎖密碼（未指定則隨機）"
                )
        );

        // ============ Key Clear 命令 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.key.lock.clear", ModPartEnum.COMMAND,
                        "Clear the code from the held key",
                        "清除手中钥匙的密码",
                        "清除手中鑰匙的密碼",
                        "清除鑰匙密碼"
                )
        );

        // ============ Key Get 命令 ============
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.key.lock.get", ModPartEnum.COMMAND,
                        "Get the code of the held key",
                        "获取手中钥匙的密码",
                        "獲取手中鑰匙的密碼",
                        "獲取鑰匙密碼"
                )
        );

        addLang(
                LangKeyValue.ofKey("task.eroticdungeongame.bind_player_to_device", ModPartEnum.DESCRIPTION,
                        "Dungeon Task",
                        "地牢任务",
                        "地牢任務",
                        "地牢事務"
                )
        );

        addLang(
                LangKeyValue.ofKey("task.eroticdungeongame.bind_player_to_device.desc", ModPartEnum.DESCRIPTION,
                        "Bind Player to device by Filter",
                        "通过过滤器设置将玩家绑在设备上",
                        "通過過濾器設置將玩家綁在設備上",
                        "据過濾器所置困於設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("task.eroticdungeongame.bind_player_to_device.condition.no_vaild_filter", ModPartEnum.DESCRIPTION,
                        "Require a filter which has workPos",
                        "需要有设置工作坐标的过滤器",
                        "需要有設置過濾器工作坐標的過濾器",
                        "据所置工作點之過濾器"
                )
        );

        addLang(
                LangKeyValue.ofKey("task.eroticdungeongame.bind_player_to_device.enable_condition.need_a_super_lead", ModPartEnum.DESCRIPTION,
                        "Require a Super Lead",
                        "需要超级拴绳",
                        "需要超級拴繩",
                        "需神駒繩"
                )
        );

        addLang(
                LangKeyValue.ofKey("filter.eroticdungeongame.mode.whitelist", ModPartEnum.DESCRIPTION,
                        "Whitelist Mode",
                        "白名单模式",
                        "白名單模式",
                        "白名册模式"
                )
        );

        addLang(
                LangKeyValue.ofKey("filter.eroticdungeongame.mode.blacklist", ModPartEnum.DESCRIPTION,
                        "Blacklist Mode",
                        "黑名单模式",
                        "黑名單模式",
                        "黑名册模式"
                )
        );
        addLang(
                LangKeyValue.ofSupplier(EDGItems.FILTER, ModPartEnum.ITEM,
                    "Filter",
                    "过滤器",
                    "過濾器",
                    "過濾器"
                )
        );

        // 物品提示
        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeongame.filter.mode", ModPartEnum.MESSAGE,
                        "Mode: %s",
                        "模式: %s",
                        "模式: %s",
                        "模式: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeongame.filter.gamemodes", ModPartEnum.MESSAGE,
                        "Game Modes: %s",
                        "游戏模式: %s",
                        "遊戲模式: %s",
                        "遊戲模式: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeongame.filter.tags", ModPartEnum.MESSAGE,
                        "Tags: %s",
                        "标签: %s",
                        "標籤: %s",
                        "標籤: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeongame.filter.teams", ModPartEnum.MESSAGE,
                        "Teams: %s",
                        "队伍: %s",
                        "隊伍: %s",
                        "隊伍: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeongame.filter.workpos", ModPartEnum.MESSAGE,
                        "Work Position: %d, %d, %d [%s]",
                        "工作坐标: %d, %d, %d [%s]",
                        "工作座標: %d, %d, %d [%s]",
                        "工作座標: %d, %d, %d [%s]"
                )
        );

        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeongame.filter.whitelist", ModPartEnum.MESSAGE,
                        "Whitelist: %d players",
                        "白名单: %d 名玩家",
                        "白名單: %d 名玩家",
                        "白名册: %d 人"
                )
        );

        addLang(
                LangKeyValue.ofKey("tooltip.eroticdungeongame.filter.blacklist", ModPartEnum.MESSAGE,
                        "Blacklist: %d players",
                        "黑名单: %d 名玩家",
                        "黑名單: %d 名玩家",
                        "黑名册: %d 人"
                )
        );

        // 维度名称
        addLang(
                LangKeyValue.ofKey("dimension.minecraft.overworld", ModPartEnum.MESSAGE,
                        "Overworld",
                        "主世界",
                        "主世界",
                        "凡界"
                )
        );

        addLang(
                LangKeyValue.ofKey("dimension.minecraft.nether", ModPartEnum.MESSAGE,
                        "Nether",
                        "地狱",
                        "地獄",
                        "幽冥"
                )
        );

        addLang(
                LangKeyValue.ofKey("dimension.minecraft.end", ModPartEnum.MESSAGE,
                        "The End",
                        "末地",
                        "終界",
                        "終末"
                )
        );

        addLang(
                LangKeyValue.ofKey("dimension.unknown", ModPartEnum.MESSAGE,
                        "Unknown Dimension",
                        "未知维度",
                        "未知維度",
                        "未知之境"
                )
        );
        // ==================== 命令反馈 ====================


        // 错误信息
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.error.not_filter", ModPartEnum.MESSAGE,
                        "The item you are holding is not a filter!",
                        "你手持的物品不是过滤器！",
                        "你手持的物品不是過濾器！",
                        "手中之物非過濾器！"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.error.invalid_gamemode", ModPartEnum.MESSAGE,
                        "Invalid game mode!",
                        "无效的游戏模式！",
                        "無效的遊戲模式！",
                        "遊戲模式無效！"
                )
        );

        // 模式设置
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.mode.set", ModPartEnum.COMMAND,
                        "Filter mode set to: %s",
                        "已将过滤器模式设置为: %s",
                        "已將過濾器模式設置為: %s",
                        "過濾器模式已設為: %s"
                )
        );

        // 游戏模式操作
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.gamemode.add", ModPartEnum.COMMAND,
                        "Added game mode: %s",
                        "已添加游戏模式: %s",
                        "已添加遊戲模式: %s",
                        "已增遊戲模式: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.gamemode.remove", ModPartEnum.COMMAND,
                        "Removed game mode: %s",
                        "已移除游戏模式: %s",
                        "已移除遊戲模式: %s",
                        "已除遊戲模式: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.gamemode.clear", ModPartEnum.COMMAND,
                        "Cleared all game modes",
                        "已清除所有游戏模式",
                        "已清除所有遊戲模式",
                        "已清所有遊戲模式"
                )
        );

        // 标签操作
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.tag.add", ModPartEnum.COMMAND,
                        "Added tag: %s",
                        "已添加标签: %s",
                        "已添加標籤: %s",
                        "已增標籤: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.tag.remove", ModPartEnum.COMMAND,
                        "Removed tag: %s",
                        "已移除标签: %s",
                        "已移除標籤: %s",
                        "已除標籤: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.tag.clear", ModPartEnum.COMMAND,
                        "Cleared all tags",
                        "已清除所有标签",
                        "已清除所有標籤",
                        "已清所有標籤"
                )
        );

        // 队伍操作
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.team.add", ModPartEnum.COMMAND,
                        "Added team: %s",
                        "已添加队伍: %s",
                        "已添加隊伍: %s",
                        "已增隊伍: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.team.remove", ModPartEnum.COMMAND,
                        "Removed team: %s",
                        "已移除队伍: %s",
                        "已移除隊伍: %s",
                        "已除隊伍: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.team.clear", ModPartEnum.COMMAND,
                        "Cleared all teams",
                        "已清除所有队伍",
                        "已清除所有隊伍",
                        "已清所有隊伍"
                )
        );

        // 工作坐标操作
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.workpos.set", ModPartEnum.COMMAND,
                        "Work position set to: %d, %d, %d [%s]",
                        "已设置工作坐标: %d, %d, %d [%s]",
                        "已設置工作座標: %d, %d, %d [%s]",
                        "已設工作座標: %d, %d, %d [%s]"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.workpos.remove", ModPartEnum.COMMAND,
                        "Work position removed",
                        "已移除工作坐标",
                        "已移除工作座標",
                        "已除工作座標"
                )
        );

        // 白名单操作
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.whitelist.add", ModPartEnum.COMMAND,
                        "Added %s to whitelist",
                        "已将 %s 加入白名单",
                        "已將 %s 加入白名單",
                        "已增 %s 入白名册"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.whitelist.remove", ModPartEnum.COMMAND,
                        "Removed %s from whitelist",
                        "已将 %s 移出白名单",
                        "已將 %s 移出白名單",
                        "已除 %s 出白名册"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.whitelist.clear", ModPartEnum.COMMAND,
                        "Cleared whitelist",
                        "已清空白名单",
                        "已清空白名單",
                        "已清白名册"
                )
        );

        // 黑名单操作
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.blacklist.add", ModPartEnum.COMMAND,
                        "Added %s to blacklist",
                        "已将 %s 加入黑名单",
                        "已將 %s 加入黑名單",
                        "已增 %s 入黑名册"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.blacklist.remove", ModPartEnum.COMMAND,
                        "Removed %s from blacklist",
                        "已将 %s 移出黑名单",
                        "已將 %s 移出黑名單",
                        "已除 %s 出黑名册"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.blacklist.clear", ModPartEnum.COMMAND,
                        "Cleared blacklist",
                        "已清空黑名单",
                        "已清空黑名單",
                        "已清黑名册"
                )
        );

        // 玩家列表显示
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.player.list.header", ModPartEnum.COMMAND,
                        "=== Filter Player List ===",
                        "=== 过滤器玩家名单 ===",
                        "=== 過濾器玩家名單 ===",
                        "=== 過濾器玩家名册 ==="
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.player.list.whitelist", ModPartEnum.COMMAND,
                        "Whitelist (%s players):",
                        "白名单 (%s 人):",
                        "白名單 (%s 人):",
                        "白名册 (%s 人):"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.player.list.blacklist", ModPartEnum.COMMAND,
                        "Blacklist (%s players):",
                        "黑名单 (%s 人):",
                        "黑名單 (%s 人):",
                        "黑名册 (%s 人):"
                )
        );

        // 过滤器信息显示
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.header", ModPartEnum.COMMAND,
                        "=== Filter Information ===",
                        "=== 过滤器信息 ===",
                        "=== 過濾器信息 ===",
                        "=== 過濾器資訊 ==="
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.mode", ModPartEnum.COMMAND,
                        "Mode: %s",
                        "模式: %s",
                        "模式: %s",
                        "模式: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.gamemodes", ModPartEnum.COMMAND,
                        "Game Modes: %s",
                        "游戏模式: %s",
                        "遊戲模式: %s",
                        "遊戲模式: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.tags", ModPartEnum.COMMAND,
                        "Tags: %s",
                        "标签: %s",
                        "標籤: %s",
                        "標籤: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.teams", ModPartEnum.COMMAND,
                        "Teams: %s",
                        "队伍: %s",
                        "隊伍: %s",
                        "隊伍: %s"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.workpos", ModPartEnum.COMMAND,
                        "Work Position: %d, %d, %d [%s]",
                        "工作坐标: %d, %d, %d [%s]",
                        "工作座標: %d, %d, %d [%s]",
                        "工作座標: %d, %d, %d [%s]"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.workpos.none", ModPartEnum.COMMAND,
                        "Work Position: Not set",
                        "工作坐标: 未设置",
                        "工作座標: 未設置",
                        "工作座標: 未設"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.whitelist", ModPartEnum.COMMAND,
                        "Whitelist: %s players",
                        "白名单: %s 人",
                        "白名單: %s 人",
                        "白名册: %s 人"
                )
        );

        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.info.blacklist", ModPartEnum.COMMAND,
                        "Blacklist: %s players",
                        "黑名单: %s 人",
                        "黑名單: %s 人",
                        "黑名册: %s 人"
                )
        );

        // 重置过滤器
        addLang(
                LangKeyValue.ofKey("command.eroticdungeongame.filter.reset", ModPartEnum.COMMAND,
                        "Filter has been reset",
                        "过滤器已重置",
                        "過濾器已重置",
                        "過濾器已復原"
                )
        );

        // 主命令
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter", ModPartEnum.COMMAND,
                        "Filter Command",
                        "过滤器命令",
                        "過濾器指令",
                        "過濾器命令"
                )
        );

// mode 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.mode", ModPartEnum.COMMAND,
                        "Filter Mode",
                        "过滤器模式",
                        "過濾器模式",
                        "過濾器模式"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.mode.desc", ModPartEnum.COMMAND,
                        "Set filter mode, default is whitelist",
                        "设置过滤器模式，缺省为白名单",
                        "設定過濾器模式，預設為白名單",
                        "設定過濾器模式，預設為白名單"
                )
        );

// gamemode 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.gamemode", ModPartEnum.COMMAND,
                        "Game Mode",
                        "游戏模式",
                        "遊戲模式",
                        "遊戲模式"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.gamemode.add", ModPartEnum.COMMAND,
                        "Add Game Mode",
                        "添加游戏模式",
                        "添加遊戲模式",
                        "添加遊戲模式"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.gamemode.desc", ModPartEnum.COMMAND,
                        "Game mode parameter, only survival/creative/adventure",
                        "游戏模式参数，只能生存/创造/冒险",
                        "遊戲模式參數，只能生存/創造/冒險",
                        "遊戲模式參數，僅限生存/創造/冒險"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.gamemode.remove", ModPartEnum.COMMAND,
                        "Remove Game Mode",
                        "移除游戏模式",
                        "移除遊戲模式",
                        "移除遊戲模式"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.gamemode.remove.desc", ModPartEnum.COMMAND,
                        "Remove game mode, remove all if not specified",
                        "移除游戏模式，缺省全移除",
                        "移除遊戲模式，預設全部移除",
                        "移除遊戲模式，預設全數移除"
                )
        );

// team 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.team", ModPartEnum.COMMAND,
                        "Team",
                        "队伍",
                        "隊伍",
                        "隊伍"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.team.add", ModPartEnum.COMMAND,
                        "Add Team",
                        "添加队伍",
                        "添加隊伍",
                        "添加隊伍"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.team.desc", ModPartEnum.COMMAND,
                        "Team parameter",
                        "队伍参数",
                        "隊伍參數",
                        "隊伍參數"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.team.remove", ModPartEnum.COMMAND,
                        "Remove Team",
                        "移除队伍",
                        "移除隊伍",
                        "移除隊伍"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.team.remove.desc", ModPartEnum.COMMAND,
                        "Remove team, remove all if not specified",
                        "移除队伍，缺省全移除",
                        "移除隊伍，預設全部移除",
                        "移除隊伍，預設全數移除"
                )
        );

// tag 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.tag", ModPartEnum.COMMAND,
                        "Tag",
                        "标签",
                        "標籤",
                        "標籤"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.tag.add", ModPartEnum.COMMAND,
                        "Add Tag",
                        "添加标签",
                        "添加標籤",
                        "添加標籤"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.tag.desc", ModPartEnum.COMMAND,
                        "Tag parameter",
                        "标签参数",
                        "標籤參數",
                        "標籤參數"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.tag.remove", ModPartEnum.COMMAND,
                        "Remove Tag",
                        "移除标签",
                        "移除標籤",
                        "移除標籤"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.tag.remove.desc", ModPartEnum.COMMAND,
                        "Remove tag, remove all if not specified",
                        "移除标签，缺省全移除",
                        "移除標籤，預設全部移除",
                        "移除標籤，預設全數移除"
                )
        );

// workpos 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.workpos", ModPartEnum.COMMAND,
                        "Work Position",
                        "工作点",
                        "工作點",
                        "工作點"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.workpos.set", ModPartEnum.COMMAND,
                        "Set Work Position",
                        "设置工作点",
                        "設置工作點",
                        "設置工作點"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.workpos.set.desc", ModPartEnum.COMMAND,
                        "Set work position, uses player's position if not specified",
                        "设置工作点，缺省则玩家位置",
                        "設定工作點，預設為玩家位置",
                        "設定工作點，預設為玩家所在之處"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.workpos.remove.desc", ModPartEnum.COMMAND,
                        "Remove work position",
                        "移除工作点",
                        "移除工作點",
                        "移除工作點"
                )
        );

// whitelist 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.whitelist", ModPartEnum.COMMAND,
                        "Whitelist",
                        "白名单",
                        "白名單",
                        "白名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.whitelist.add", ModPartEnum.COMMAND,
                        "Add to Whitelist",
                        "添加白名单",
                        "添加白名單",
                        "添加白名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.whitelist.desc", ModPartEnum.COMMAND,
                        "Add player to whitelist",
                        "添加玩家到白名单",
                        "添加玩家到白名單",
                        "添加玩家至白名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.whitelist.remove", ModPartEnum.COMMAND,
                        "Remove from Whitelist",
                        "移除白名单",
                        "移除白名單",
                        "移除白名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.whitelist.remove.desc", ModPartEnum.COMMAND,
                        "Remove player from whitelist",
                        "从白名单移除玩家",
                        "從白名單移除玩家",
                        "自白名單移除玩家"
                )
        );

// blacklist 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.blacklist", ModPartEnum.COMMAND,
                        "Blacklist",
                        "黑名单",
                        "黑名單",
                        "黑名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.blacklist.add", ModPartEnum.COMMAND,
                        "Add to Blacklist",
                        "添加黑名单",
                        "添加黑名單",
                        "添加黑名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.blacklist.desc", ModPartEnum.COMMAND,
                        "Add player to blacklist",
                        "添加玩家到黑名单",
                        "添加玩家到黑名單",
                        "添加玩家至黑名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.blacklist.remove", ModPartEnum.COMMAND,
                        "Remove from Blacklist",
                        "移除黑名单",
                        "移除黑名單",
                        "移除黑名單"
                )
        );

        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.blacklist.remove.desc", ModPartEnum.COMMAND,
                        "Remove player from blacklist",
                        "从黑名单移除玩家",
                        "從黑名單移除玩家",
                        "自黑名單移除玩家"
                )
        );

        // info 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.info", ModPartEnum.COMMAND,
                        "Filter Info",
                        "过滤器信息",
                        "過濾器信息",
                        "過濾器資訊"
                )
        );

        // reset 分支
        addLang(
                LangKeyValue.ofKey("commands.help.eroticdungeongame.filter.reset", ModPartEnum.COMMAND,
                        "Filter has been reset",
                        "重置过滤器",
                        "重置過濾器",
                        "復原過濾器"
                )
        );
        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.capture.1", ModPartEnum.MESSAGE,
                        "Hehe, gotcha",
                        "嘿嘿，抓到你了",
                        "嘿嘿，抓到你了",
                        "嘿嘿，擒獲汝矣"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.capture.2", ModPartEnum.MESSAGE,
                        "No place to run now",
                        "没地方跑了吧",
                        "沒地方跑了吧",
                        "無處可逃矣"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.capture.3", ModPartEnum.MESSAGE,
                        "Taking you to a nice place",
                        "带你去个好地方",
                        "帶你去個好地方",
                        "攜汝往佳境"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.capture.master.1", ModPartEnum.MESSAGE,
                        "Executing %s's orders...",
                        "执行 %s 的指令中...",
                        "執行 %s 的指令中...",
                        "遵 %s 之令中..."
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.find.1", ModPartEnum.MESSAGE,
                        "Target acquired",
                        "发现目标",
                        "發現目標",
                        "已覓得目標"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.toward.1", ModPartEnum.MESSAGE,
                        "Approaching target",
                        "抓捕目标中",
                        "抓捕目標中",
                        "正趨近目標"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.device_not_found.1", ModPartEnum.MESSAGE,
                        "No device found",
                        "未发现空余设备",
                        "未發現空餘設備",
                        "未尋得空設備"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.bind.1", ModPartEnum.MESSAGE,
                        "Trapped +1",
                        "困住加一",
                        "困住加一",
                        "困縛一人"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.idle.1", ModPartEnum.MESSAGE,
                        "Capturing intruders is a form of cultivation",
                        "抓入侵者是一种修行",
                        "抓入侵者是一種修行",
                        "擒賊乃修行也"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.idle.master.1", ModPartEnum.MESSAGE,
                        "It is my honor to catch intruders for %s",
                        "为 %s 抓入侵者是我的荣幸",
                        "為 %s 抓入侵者是我的榮幸",
                        "為 %s 擒賊乃吾之榮幸"
                )
        );

        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.idle.master.2", ModPartEnum.MESSAGE,
                        "For the %s Empire, I must work harder",
                        "为了 %s 帝国，我要更具努力工作",
                        "為了 %s 帝國，我要更努力工作",
                        "為 %s 帝國，當倍加勤勉"
                )
        );
        addLang(
                LangKeyValue.ofKey("message.eroticdungeongame.empty", ModPartEnum.MESSAGE,
                        "",
                        "",
                        "",
                        ""
                )
        );

    }
    private void initEntityKeyValues() {
        addLang(
                LangKeyValue.ofKey(ModPartEnum.ENTITY.getFullKey(EroticDungeon.MOD_ID, "seat"), ModPartEnum.ENTITY,
                    "Seat", "座椅", "座椅", "座"
                )
        );
    }

    private void initBlockAndBlockItemLangKeyValues() {
        for (RackBlock rackBlock : EDGBlocks.getRackBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(rackBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> rackBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Rack",
                    woodNameTranslation.get(1) + "拉肢架",
                    woodNameTranslation.get(2) + "拉肢架",
                    woodNameTranslation.get(3) + "拉肢架"
            );
            addLang(keyValue);
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.RACK_ITEMS.get(rackBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (CuffBedBlock cuffedBlock : EDGBlocks.getCuffedBlocks()) {
            Tuple colorNameTranslation = ColorContent.getColorNameTranslation(cuffedBlock.getColor());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> cuffedBlock, ModPartEnum.BLOCK,
                    colorNameTranslation.get(0) + " Cuff Bed",
                    colorNameTranslation.get(1) + "拘束床",
                    colorNameTranslation.get(2) + "拘束床",
                    colorNameTranslation.get(3) + "拘束床"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.CUFF_BED_ITEMS.get(cuffedBlock.getColor()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (CruxBlock cruxBlock : EDGBlocks.getCruxBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(cruxBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> cruxBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Crux",
                    woodNameTranslation.get(1) + "十字架",
                    woodNameTranslation.get(2) + "十字架",
                    woodNameTranslation.get(3) + "十字架"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.CRUX_ITEMS.get(cruxBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (PetrineCrossBlock petrineCrossBlock : EDGBlocks.getPetrineCrossBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(petrineCrossBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> petrineCrossBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Petrine Cross",
                    woodNameTranslation.get(1) + "彼得十字架",
                    woodNameTranslation.get(2) + "彼得十字架",
                    woodNameTranslation.get(3) + "十字架"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.PETRINE_CROSS_ITEMS.get(petrineCrossBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (XCrossBlock xCrossBlock : EDGBlocks.getXCrossBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(xCrossBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> xCrossBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " X Cross",
                    woodNameTranslation.get(1) + "X形十字架",
                    woodNameTranslation.get(2) + "X形十字架",
                    woodNameTranslation.get(3) + "乂形架"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.X_CROSS_ITEMS.get(xCrossBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (SpanishDonkeyBlock spanishDonkeyBlock : EDGBlocks.getSpanishDonkeyBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(spanishDonkeyBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> spanishDonkeyBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Spanish Donkey",
                    woodNameTranslation.get(1) + "木马",
                    woodNameTranslation.get(2) + "木馬",
                    woodNameTranslation.get(3) + "木驢"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.SPANISH_DONKEY_ITEMS.get(spanishDonkeyBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (PilloryBlock pilloryBlock : EDGBlocks.getPilloryBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(pilloryBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> pilloryBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Pillory",
                    woodNameTranslation.get(1) + "颈手枷",
                    woodNameTranslation.get(2) + "頸手枷",
                    woodNameTranslation.get(3) + "枷鎖"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.PILLORY_ITEMS.get(pilloryBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (WallRackBlock wallRackBlock : EDGBlocks.getWallRackBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(wallRackBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> wallRackBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Wall Rack",
                    woodNameTranslation.get(1) + "壁挂拉肢架",
                    woodNameTranslation.get(2) + "壁掛拉肢架",
                    woodNameTranslation.get(3) + "牆架"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.WALL_RACK_ITEMS.get(wallRackBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }

        for (HangingPostBlock hangingPostBlock : EDGBlocks.getHangingPostBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(hangingPostBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> hangingPostBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Hanging Post",
                    woodNameTranslation.get(1) + "悬挂架",
                    woodNameTranslation.get(2) + "懸挂架",
                    woodNameTranslation.get(3) + "絞刑架"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.HANGING_POST_ITEMS.get(hangingPostBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (ProneBenchBlock proneBenchBlock : EDGBlocks.getProneBenchBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(proneBenchBlock.getWoodType());
            Tuple colorNameTranslation = ColorContent.getColorNameTranslation(proneBenchBlock.getColor());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> proneBenchBlock, ModPartEnum.BLOCK,
                    colorNameTranslation.get(0) + " " + woodNameTranslation.get(0) + " Prone Bench",
                    "" + colorNameTranslation.get(1) + woodNameTranslation.get(1) + "俯卧凳",
                    "" + colorNameTranslation.get(2) + woodNameTranslation.get(2) + "俯卧凳",
                    "" + colorNameTranslation.get(3) + woodNameTranslation.get(3) + "刑凳"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.PRONE_BENCH_ITEMS.get(Pair.of(proneBenchBlock.getColor(), proneBenchBlock.getWoodType())), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        for (CuffPoleBlock cuffPoleBlock : EDGBlocks.getCuffPoleBlocks()) {
            Tuple woodNameTranslation = WoodTypeHelper.getWoodNameTranslation(cuffPoleBlock.getWoodType());
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    () -> cuffPoleBlock, ModPartEnum.BLOCK,
                    woodNameTranslation.get(0) + " Cuff Pole",
                    woodNameTranslation.get(1) + "锁链柱",
                    woodNameTranslation.get(2) + "鎖鏈柱",
                    woodNameTranslation.get(3) + "刑柱"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGItems.CUFF_POLE_ITEMS.get(cuffPoleBlock.getWoodType()), ModPartEnum.ITEM,
                            keyValue
                    )
            );
        }
        {
            LangKeyValue keyValue = LangKeyValue.ofSupplier(
                    EDGItems.IRON_CAGE_ITEM, ModPartEnum.ITEM,
                    "Iron Cage", "铁笼", "鐵籠", "籠"
            );
            addLang(
                    keyValue
            );
            addLang(
                    LangKeyValue.copyOf(
                            EDGBlocks.IRON_CAGE, ModPartEnum.BLOCK,
                            keyValue
                    )
            );
        }
    }

    @Contract(pure = true)
    @Override
    public @Unmodifiable List<? extends ILangKeyValue> getValues() {
        return List.copyOf(langKeyValues);
    }

    /**
     * Add lang.
     *
     * @param keyValue the key value
     */
    public void addLang(LangKeyValue keyValue) {
        langKeyValues.add(keyValue);
    }

    /**
     * Clear.
     */
    public void clear() {
        langKeyValues.clear();
    }
}
