Эх сурвалжийг харах

"Updated" to use the new Cloth Config

Unknown 6 жил өмнө
parent
commit
ea7261a02f

+ 2 - 2
build.gradle

@@ -40,7 +40,7 @@ dependencies {
     modCompile "net.fabricmc.fabric-api:fabric-events-lifecycle-v0:${project.fabric_events_lifecycle}"
     modCompile "net.fabricmc.fabric-api:fabric-resource-loader-v0:${project.fabric_resource_loader}"
     modCompile "cloth:ClothEvents:${cloth_events_version}"
-    modCompile "cloth-config:ClothConfig:${cloth_config_version}"
+    modCompile "cloth-config:ClothConfig2:${cloth_config_version}"
     modCompile "blue.endless:jankson:${project.jankson_version}"
     if (includeDep) {
         include "net.fabricmc.fabric-api:fabric-keybindings-v0:${project.fabric_keybindings}"
@@ -49,7 +49,7 @@ dependencies {
         include "net.fabricmc.fabric-api:fabric-events-lifecycle-v0:${project.fabric_events_lifecycle}"
         include "net.fabricmc.fabric-api:fabric-resource-loader-v0:${project.fabric_resource_loader}"
         include "cloth:ClothEvents:${cloth_events_version}"
-        include "cloth-config:ClothConfig:${cloth_config_version}"
+        include "cloth-config:ClothConfig2:${cloth_config_version}"
         include "blue.endless:jankson:${project.jankson_version}"
     }
     modCompile "io.github.prospector.modmenu:ModMenu:${modmenu_version}"

+ 1 - 1
gradle.properties

@@ -4,7 +4,7 @@ yarn_version=1.14.2+build.2
 fabricloader_version=0.4.7+build.147
 jankson_version=1.1.0
 cloth_events_version=0.3.1.23
-cloth_config_version=0.2.4.17
+cloth_config_version=0.1.0
 modmenu_version=1.5.4-85
 
 fabric_keybindings=0.1.0+59147463

+ 1 - 1
src/main/java/me/shedaniel/rei/client/ConfigManagerImpl.java

@@ -136,7 +136,7 @@ public class ConfigManagerImpl implements ConfigManager {
     
     @Override
     public Screen getConfigScreen(Screen parent) {
-        if (FabricLoader.getInstance().isModLoaded("cloth-config")) {
+        if (FabricLoader.getInstance().isModLoaded("cloth-config2")) {
             try {
                 return Screen.class.cast(Class.forName("me.shedaniel.rei.utils.ClothScreenRegistry").getDeclaredMethod("getConfigScreen", Screen.class).invoke(null, parent));
             } catch (Exception e) {

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java

@@ -5,7 +5,7 @@
 
 package me.shedaniel.rei.gui.credits;
 
-import me.shedaniel.clothconfig.gui.DynamicSmoothScrollingEntryListWidget;
+import me.shedaniel.clothconfig2.gui.widget.DynamicSmoothScrollingEntryListWidget;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.network.chat.Component;

+ 4 - 4
src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java

@@ -7,16 +7,16 @@ package me.shedaniel.rei.gui.credits;
 
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.CreditsItem;
-import me.shedaniel.rei.gui.widget.ButtonWidget;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
+import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.network.chat.TextComponent;
 
 public class CreditsScreen extends Screen {
     
     private Screen parent;
-    private ButtonWidget buttonDone;
+    private AbstractPressableButtonWidget buttonDone;
     private CreditsEntryListWidget entryListWidget;
     
     public CreditsScreen(Screen parent) {
@@ -42,9 +42,9 @@ public class CreditsScreen extends Screen {
         for(String line : I18n.translate("text.rei.credit.text").split("\n"))
             entryListWidget.creditsAddEntry(new CreditsItem(new TextComponent(line)));
         entryListWidget.creditsAddEntry(new CreditsItem(new TextComponent("")));
-        children.add(buttonDone = new ButtonWidget(width / 2 - 100, height - 26, 200, 20, I18n.translate("gui.done")) {
+        children.add(buttonDone = new AbstractPressableButtonWidget(width / 2 - 100, height - 26, 200, 20, I18n.translate("gui.done")) {
             @Override
-            public void onPressed() {
+            public void onPress() {
                 CreditsScreen.this.minecraft.openScreen(parent);
                 if (parent instanceof AbstractContainerScreen)
                     ScreenHelper.getLastOverlay().init();

+ 38 - 32
src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java

@@ -5,13 +5,16 @@
 
 package me.shedaniel.rei.utils;
 
-import me.shedaniel.cloth.api.ConfigScreenBuilder;
-import me.shedaniel.cloth.gui.entries.BooleanListEntry;
-import me.shedaniel.cloth.gui.entries.EnumListEntry;
-import me.shedaniel.cloth.gui.entries.IntegerSliderEntry;
-import me.shedaniel.cloth.gui.entries.StringListEntry;
 import me.shedaniel.cloth.hooks.ScreenHooks;
+import me.shedaniel.clothconfig2.api.ConfigBuilder;
+import me.shedaniel.clothconfig2.api.ConfigCategory;
+import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
+import me.shedaniel.clothconfig2.gui.entries.BooleanListEntry;
+import me.shedaniel.clothconfig2.gui.entries.EnumListEntry;
+import me.shedaniel.clothconfig2.gui.entries.IntegerSliderEntry;
+import me.shedaniel.clothconfig2.gui.entries.StringListEntry;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.ConfigManager;
 import me.shedaniel.rei.api.ItemCheatingMode;
 import me.shedaniel.rei.client.RecipeScreenType;
 import me.shedaniel.rei.client.ScreenHelper;
@@ -30,18 +33,21 @@ public class ClothScreenRegistry {
     public static final String RESET = "text.cloth-config.reset_value";
     
     public static Screen getConfigScreen(Screen parent) {
-        ConfigScreenBuilder builder = ConfigScreenBuilder.create(parent, "text.rei.config.title", savedConfig -> {
+        final ConfigManager configManager = RoughlyEnoughItemsCore.getConfigManager();
+        ConfigBuilder builder = ConfigBuilder.create().setParentScreen(parent).setTitle("text.rei.config.title").setSavingRunnable(() -> {
             try {
-                RoughlyEnoughItemsCore.getConfigManager().saveConfig();
+                configManager.saveConfig();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         });
-        builder.addCategory("text.rei.config.general").addOption(new BooleanListEntry("text.rei.config.cheating", RoughlyEnoughItemsCore.getConfigManager().getConfig().cheating, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().cheating = bool) {
+        ConfigEntryBuilder entryBuilder = ConfigEntryBuilder.create();
+        ConfigCategory general = builder.getOrCreateCategory("text.rei.config.general");
+        general.addEntry(new BooleanListEntry("text.rei.config.cheating", configManager.getConfig().cheating, RESET, () -> false, bool -> configManager.getConfig().cheating = bool) {
             @Override
             public Optional<String[]> getTooltip() {
                 String s = null;
-                if (!getObject())
+                if (!getValue())
                     s = I18n.translate("text.rei.cheating_disabled");
                 else if (!RoughlyEnoughItemsCore.hasOperatorPermission())
                     s = I18n.translate("text.rei.cheating_enabled_no_perms");
@@ -52,40 +58,40 @@ public class ClothScreenRegistry {
                 return Optional.ofNullable(new String[]{s});
             }
         });
-        ConfigScreenBuilder.CategoryBuilder appearance = builder.addCategory("text.rei.config.appearance");
-        appearance.addOption(new BooleanListEntry("text.rei.config.dark_theme", ScreenHelper.isDarkModeEnabled(), RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().darkTheme = bool, () -> getConfigTooltip("dark_theme")));
-        appearance.addOption(new EnumListEntry<>("text.rei.config.recipe_screen_type", RecipeScreenType.class, RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType, RESET, () -> RecipeScreenType.UNSET, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType = bool, EnumListEntry.DEFAULT_NAME_PROVIDER, () -> getConfigTooltip("recipe_screen_type")));
-        appearance.addOption(new BooleanListEntry("text.rei.config.side_search_box", RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField = bool, () -> getConfigTooltip("side_search_box")));
-        appearance.addOption(new EnumListEntry<>("text.rei.config.list_ordering", ItemListOrderingConfig.class, ItemListOrderingConfig.from(RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering, RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending), RESET, () -> ItemListOrderingConfig.REGISTRY_ASCENDING, config -> {
-            RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering = config.getOrdering();
-            RoughlyEnoughItemsCore.getConfigManager().getConfig().isAscending = config.isAscending();
+        ConfigCategory appearance = builder.getOrCreateCategory("text.rei.config.appearance");
+        appearance.addEntry(entryBuilder.startBooleanToggle("text.rei.config.dark_theme", ScreenHelper.isDarkModeEnabled()).setDefaultValue(() -> false).setSaveConsumer(bool -> configManager.getConfig().darkTheme = bool).setTooltipSupplier(() -> getConfigTooltip("dark_theme")).buildEntry());
+        appearance.addEntry(new EnumListEntry<>("text.rei.config.recipe_screen_type", RecipeScreenType.class, configManager.getConfig().screenType, RESET, () -> RecipeScreenType.UNSET, bool -> configManager.getConfig().screenType = bool, EnumListEntry.DEFAULT_NAME_PROVIDER, () -> getConfigTooltip("recipe_screen_type")));
+        appearance.addEntry(entryBuilder.startBooleanToggle("text.rei.config.side_search_box", configManager.getConfig().sideSearchField).setDefaultValue(() -> false).setSaveConsumer(bool -> configManager.getConfig().sideSearchField = bool).setTooltipSupplier(() -> getConfigTooltip("side_search_box")).buildEntry());
+        appearance.addEntry(new EnumListEntry<>("text.rei.config.list_ordering", ItemListOrderingConfig.class, ItemListOrderingConfig.from(configManager.getConfig().itemListOrdering, configManager.getConfig().isAscending), RESET, () -> ItemListOrderingConfig.REGISTRY_ASCENDING, config -> {
+            configManager.getConfig().itemListOrdering = config.getOrdering();
+            configManager.getConfig().isAscending = config.isAscending();
         }, EnumListEntry.DEFAULT_NAME_PROVIDER, () -> getConfigTooltip("list_ordering", ItemListOrderingConfig.REGISTRY_ASCENDING.toString())));
-        appearance.addOption(new BooleanListEntry("text.rei.config.item_list_position", RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel = bool, () -> getConfigTooltip("item_list_position")) {
+        appearance.addEntry(new BooleanListEntry("text.rei.config.item_list_position", configManager.getConfig().mirrorItemPanel, RESET, () -> false, bool -> configManager.getConfig().mirrorItemPanel = bool, () -> getConfigTooltip("item_list_position")) {
             @Override
             public String getYesNoText(boolean bool) {
                 return I18n.translate(bool ? "text.rei.config.item_list_position.left" : "text.rei.config.item_list_position.right");
             }
         });
-        appearance.addOption(new IntegerSliderEntry("text.rei.config.max_recipes_per_page", 2, 99, RoughlyEnoughItemsCore.getConfigManager().getConfig().maxRecipePerPage, RESET, () -> 3, i -> RoughlyEnoughItemsCore.getConfigManager().getConfig().maxRecipePerPage = i, () -> getConfigTooltip("max_recipes_per_page")));
-        appearance.addOption(new BooleanListEntry("text.rei.config.light_gray_recipe_border", RoughlyEnoughItemsCore.getConfigManager().getConfig().lightGrayRecipeBorder, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().lightGrayRecipeBorder = bool, () -> getConfigTooltip("light_gray_recipe_border")));
-        appearance.addOption(new BooleanListEntry("text.rei.config.villager_screen_permanent_scroll_bar", RoughlyEnoughItemsCore.getConfigManager().getConfig().villagerScreenPermanentScrollBar, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().villagerScreenPermanentScrollBar = bool, () -> getConfigTooltip("villager_screen_permanent_scroll_bar")));
-        ConfigScreenBuilder.CategoryBuilder action = builder.addCategory("text.rei.config.action");
-        action.addOption(new EnumListEntry<>("text.rei.config.item_cheating_mode", ItemCheatingMode.class, RoughlyEnoughItemsCore.getConfigManager().getConfig().itemCheatingMode, RESET, () -> ItemCheatingMode.REI_LIKE, i -> RoughlyEnoughItemsCore.getConfigManager().getConfig().itemCheatingMode = i, e -> {
+        appearance.addEntry(new IntegerSliderEntry("text.rei.config.max_recipes_per_page", 2, 99, configManager.getConfig().maxRecipePerPage, RESET, () -> 3, i -> configManager.getConfig().maxRecipePerPage = i, () -> getConfigTooltip("max_recipes_per_page")));
+        appearance.addEntry(new BooleanListEntry("text.rei.config.light_gray_recipe_border", configManager.getConfig().lightGrayRecipeBorder, RESET, () -> false, bool -> configManager.getConfig().lightGrayRecipeBorder = bool, () -> getConfigTooltip("light_gray_recipe_border")));
+        appearance.addEntry(new BooleanListEntry("text.rei.config.villager_screen_permanent_scroll_bar", configManager.getConfig().villagerScreenPermanentScrollBar, RESET, () -> false, bool -> configManager.getConfig().villagerScreenPermanentScrollBar = bool, () -> getConfigTooltip("villager_screen_permanent_scroll_bar")));
+        ConfigCategory action = builder.getOrCreateCategory("text.rei.config.action");
+        action.addEntry(new EnumListEntry<>("text.rei.config.item_cheating_mode", ItemCheatingMode.class, configManager.getConfig().itemCheatingMode, RESET, () -> ItemCheatingMode.REI_LIKE, i -> configManager.getConfig().itemCheatingMode = i, e -> {
             return I18n.translate("text.rei.config.item_cheating_mode." + e.name().toLowerCase());
         }, () -> getConfigTooltip("item_cheating_mode")));
-        action.addOption(new StringListEntry("text.rei.give_command", RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand, RESET, () -> "/give {player_name} {item_identifier}{nbt} {count}", s -> RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand = s, () -> getConfigTooltip("give_command")));
-        action.addOption(new StringListEntry("text.rei.gamemode_command", RoughlyEnoughItemsCore.getConfigManager().getConfig().gamemodeCommand, RESET, () -> "/gamemode {gamemode}", s -> RoughlyEnoughItemsCore.getConfigManager().getConfig().gamemodeCommand = s, () -> getConfigTooltip("gamemode_command")));
-        action.addOption(new StringListEntry("text.rei.weather_command", RoughlyEnoughItemsCore.getConfigManager().getConfig().weatherCommand, RESET, () -> "/weather {weather}", s -> RoughlyEnoughItemsCore.getConfigManager().getConfig().weatherCommand = s, () -> getConfigTooltip("weather_command")));
-        action.addOption(new BooleanListEntry("text.rei.config.register_in_other_thread", RoughlyEnoughItemsCore.getConfigManager().getConfig().registerRecipesInAnotherThread, RESET, () -> true, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().registerRecipesInAnotherThread = bool, () -> getConfigTooltip("register_in_other_thread")));
-        ConfigScreenBuilder.CategoryBuilder modules = builder.addCategory("text.rei.config.modules");
-        modules.addOption(new BooleanListEntry("text.rei.config.enable_craftable_only", RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton, RESET, () -> true, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton = bool, () -> getConfigTooltip("enable_craftable_only")));
-        modules.addOption(new BooleanListEntry("text.rei.config.enable_util_buttons", RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons = bool, () -> getConfigTooltip("enable_util_buttons")));
-        modules.addOption(new BooleanListEntry("text.rei.config.disable_recipe_book", RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook, RESET, () -> false, bool -> RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook = bool, () -> getConfigTooltip("disable_recipe_book")));
-        return builder.build(screen -> {
+        action.addEntry(new StringListEntry("text.rei.give_command", configManager.getConfig().giveCommand, RESET, () -> "/give {player_name} {item_identifier}{nbt} {count}", s -> configManager.getConfig().giveCommand = s, () -> getConfigTooltip("give_command")));
+        action.addEntry(new StringListEntry("text.rei.gamemode_command", configManager.getConfig().gamemodeCommand, RESET, () -> "/gamemode {gamemode}", s -> configManager.getConfig().gamemodeCommand = s, () -> getConfigTooltip("gamemode_command")));
+        action.addEntry(new StringListEntry("text.rei.weather_command", configManager.getConfig().weatherCommand, RESET, () -> "/weather {weather}", s -> configManager.getConfig().weatherCommand = s, () -> getConfigTooltip("weather_command")));
+        action.addEntry(new BooleanListEntry("text.rei.config.register_in_other_thread", configManager.getConfig().registerRecipesInAnotherThread, RESET, () -> true, bool -> configManager.getConfig().registerRecipesInAnotherThread = bool, () -> getConfigTooltip("register_in_other_thread")));
+        ConfigCategory modules = builder.getOrCreateCategory("text.rei.config.modules");
+        modules.addEntry(new BooleanListEntry("text.rei.config.enable_craftable_only", configManager.getConfig().enableCraftableOnlyButton, RESET, () -> true, bool -> configManager.getConfig().enableCraftableOnlyButton = bool, () -> getConfigTooltip("enable_craftable_only")));
+        modules.addEntry(new BooleanListEntry("text.rei.config.enable_util_buttons", configManager.getConfig().showUtilsButtons, RESET, () -> false, bool -> configManager.getConfig().showUtilsButtons = bool, () -> getConfigTooltip("enable_util_buttons")));
+        modules.addEntry(new BooleanListEntry("text.rei.config.disable_recipe_book", configManager.getConfig().disableRecipeBook, RESET, () -> false, bool -> configManager.getConfig().disableRecipeBook = bool, () -> getConfigTooltip("disable_recipe_book")));
+        return builder.setAfterInitConsumer(screen -> {
             ButtonWidget w = new ButtonWidget(6, 6, 60, 20, I18n.translate("text.rei.credits"), widget -> MinecraftClient.getInstance().openScreen(new CreditsScreen(MinecraftClient.getInstance().currentScreen)));
             ((ScreenHooks) screen).cloth_getButtonWidgets().add(0, w);
             ((ScreenHooks) screen).cloth_getChildren().add(0, w);
-        });
+        }).build();
     }
     
     private static Optional<String[]> getConfigTooltip(String s, Object... o) {

+ 1 - 1
src/main/resources/assets/roughlyenoughitems/lang/bg_bg.json

@@ -71,5 +71,5 @@
   "text.rei.config.enable_legacy_speedcraft_support": "Включи поддръжка на стари приставки: ",
   "text.rei.config.april_fools": "Ден на шегата",
   "text.rei.config.april_fools.2019": "Включи 2019 REI шега за деня на шегата: ",
-  "text.rei.no_config_api": "Cloth Config API не е инсталиран!\nМоля инсталирайте го, за да се покаже екранът за конфигурация!"
+  "text.rei.no_config_api": "Cloth Config v2 API не е инсталиран!\nМоля инсталирайте го, за да се покаже екранът за конфигурация!"
 }

+ 1 - 1
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -93,7 +93,7 @@
   "text.rei.config.item_cheating_mode.rei_like": "Normal",
   "text.rei.config.item_cheating_mode.jei_like": "Reversed",
   "text.rei.config.light_gray_recipe_border": "Light Gray Recipe Border:",
-  "text.rei.config_api_failed": "You arrived here either if Cloth Config API failed or you don't have it installed!\nUpdate / Install the API and report to the bug tracker.",
+  "text.rei.config_api_failed": "You arrived here either if Cloth Config v2 API failed or you don't have it installed!\nUpdate / Install the API and report to the bug tracker.",
   "text.rei.back": "Back",
   "text.rei.config.recipe_screen_type": "Screen Type",
   "text.rei.config.recipe_screen_type.unset": "Not Set",

+ 1 - 1
src/main/resources/assets/roughlyenoughitems/lang/et_ee.json

@@ -91,7 +91,7 @@
   "text.rei.config.item_cheating_mode.rei_like": "Tavaline",
   "text.rei.config.item_cheating_mode.jei_like": "Pööratud",
   "text.rei.config.light_gray_recipe_border": "Helehall retsepti taust:",
-  "text.rei.config_api_failed": "Sa sattusid siia, kui Cloth Config API nurjus või sul polnud seda paigaldatud!\nUuenda või paigalda antud API and ning teata sellest vigade loetelus.",
+  "text.rei.config_api_failed": "Sa sattusid siia, kui Cloth Config v2 API nurjus või sul polnud seda paigaldatud!\nUuenda või paigalda antud API and ning teata sellest vigade loetelus.",
   "text.rei.back": "Tagasi",
   "text.rei.config.recipe_screen_type": "Kuvatüüp",
   "text.rei.config.recipe_screen_type.unset": "Määramata",

+ 1 - 1
src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json

@@ -93,7 +93,7 @@
   "text.rei.config.item_cheating_mode.rei_like": "标准",
   "text.rei.config.item_cheating_mode.jei_like": "反转",
   "text.rei.config.light_gray_recipe_border": "浅灰色配方边框:",
-  "text.rei.config_api_failed": "如果Cloth Config API装载失败了或你没有安装它,你就会到达这个界面!\n升级/安装API或向bug跟踪器报告.",
+  "text.rei.config_api_failed": "如果Cloth Config v2 API装载失败了或你没有安装它,你就会到达这个界面!\n升级/安装API或向bug跟踪器报告.",
   "text.rei.back": "返回",
   "text.rei.config.recipe_screen_type": "界面类型",
   "text.rei.config.recipe_screen_type.unset": "未设置",

+ 1 - 1
src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json

@@ -93,7 +93,7 @@
   "text.rei.config.item_cheating_mode.rei_like": "標準",
   "text.rei.config.item_cheating_mode.jei_like": "反轉",
   "text.rei.config.light_gray_recipe_border": "淺灰色配方邊框:",
-  "text.rei.config_api_failed": "如果Cloth Config API裝載失敗了或你沒有安裝它,你就會到達這個界面!\n升級/安裝API或向bug跟踪器報告.",
+  "text.rei.config_api_failed": "如果Cloth Config v2 API裝載失敗了或你沒有安裝它,你就會到達這個界面!\n升級/安裝API或向bug跟踪器報告.",
   "text.rei.back": "返回",
   "text.rei.config.recipe_screen_type": "界麵類型",
   "text.rei.config.recipe_screen_type.unset": "未設置",