Selaa lähdekoodia

Random Updates

Unknown 5 vuotta sitten
vanhempi
sitoutus
b181c1de42

+ 3 - 8
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java

@@ -57,7 +57,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
     
     public static final Logger LOGGER;
     private static final RecipeHelper RECIPE_HELPER = new RecipeHelperImpl();
-    private static final PluginDisabler PLUGIN_DISABLER = new PluginDisablerImpl();
     private static final ItemRegistry ITEM_REGISTRY = new ItemRegistryImpl();
     private static final DisplayHelper DISPLAY_HELPER = new DisplayHelperImpl();
     private static final Map<Identifier, REIPluginEntry> plugins = Maps.newHashMap();
@@ -72,7 +71,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
         return RECIPE_HELPER;
     }
     
-    public static me.shedaniel.rei.api.ConfigManager getConfigManager() {
+    public static ConfigManager getConfigManager() {
         return configManager;
     }
     
@@ -80,10 +79,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
         return ITEM_REGISTRY;
     }
     
-    public static PluginDisabler getPluginDisabler() {
-        return PLUGIN_DISABLER;
-    }
-    
     public static DisplayHelper getDisplayHelper() {
         return DISPLAY_HELPER;
     }
@@ -189,7 +184,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                     throw new IllegalArgumentException("REI plugin is too old!");
                 registerPlugin(reiPlugin);
                 if (reiPlugin instanceof REIPluginV0)
-                    ((REIPluginV0) reiPlugin).onFirstLoad(getPluginDisabler());
+                    ((REIPluginV0) reiPlugin).onFirstLoad();
             } catch (Exception e) {
                 e.printStackTrace();
                 RoughlyEnoughItemsCore.LOGGER.error("[REI] Can't load REI plugins from %s: %s", reiPlugin.getClass(), e.getLocalizedMessage());
@@ -198,7 +193,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
         for (REIPluginV0 reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins_v0", REIPluginV0.class)) {
             try {
                 registerPlugin(reiPlugin);
-                reiPlugin.onFirstLoad(getPluginDisabler());
+                reiPlugin.onFirstLoad();
             } catch (Exception e) {
                 e.printStackTrace();
                 RoughlyEnoughItemsCore.LOGGER.error("[REI] Can't load REI plugins from %s: %s", reiPlugin.getClass(), e.getLocalizedMessage());

+ 0 - 59
src/main/java/me/shedaniel/rei/api/PluginDisabler.java

@@ -1,59 +0,0 @@
-/*
- * Roughly Enough Items by Danielshe.
- * Licensed under the MIT License.
- */
-
-package me.shedaniel.rei.api;
-
-import net.minecraft.util.Identifier;
-
-public interface PluginDisabler {
-    
-    /**
-     * Disables multiple functions from a plugin
-     *
-     * @param plugin    the identifier of the plugin
-     * @param functions the array of functions to be disabled
-     */
-    default void disablePluginFunctions(Identifier plugin, PluginFunction... functions) {
-        for (PluginFunction function : functions)
-            disablePluginFunction(plugin, function);
-    }
-    
-    /**
-     * Enables multiple functions from a plugin
-     *
-     * @param plugin    the identifier of the plugin
-     * @param functions the array of functions to be enabled
-     */
-    default void enablePluginFunctions(Identifier plugin, PluginFunction... functions) {
-        for (PluginFunction function : functions)
-            enablePluginFunction(plugin, function);
-    }
-    
-    /**
-     * Disables a function from a plugin
-     *
-     * @param plugin   the identifier of the plugin
-     * @param function the function to be disabled
-     */
-    void disablePluginFunction(Identifier plugin, PluginFunction function);
-    
-    /**
-     * Enables a function from a plugin
-     *
-     * @param plugin   the identifier of the plugin
-     * @param function the function to be enabled
-     */
-    void enablePluginFunction(Identifier plugin, PluginFunction function);
-    
-    /**
-     * Checks if a plugin function has been disabled
-     *
-     * @param plugin   the identifier of the plugin
-     * @param function the function to check
-     * @return whether if it has been disabled
-     */
-    boolean isFunctionEnabled(Identifier plugin, PluginFunction function);
-    
-}

+ 0 - 14
src/main/java/me/shedaniel/rei/api/PluginFunction.java

@@ -1,14 +0,0 @@
-/*
- * Roughly Enough Items by Danielshe.
- * Licensed under the MIT License.
- */
-
-package me.shedaniel.rei.api;
-
-public enum PluginFunction {
-    REGISTER_ITEMS,
-    REGISTER_CATEGORIES,
-    REGISTER_RECIPE_DISPLAYS,
-    REGISTER_BOUNDS,
-    REGISTER_OTHERS;
-}

+ 9 - 2
src/main/java/me/shedaniel/rei/api/RecipeHelper.java

@@ -6,7 +6,6 @@
 package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.client.RecipeHelperImpl;
 import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Recipe;
@@ -215,6 +214,14 @@ public interface RecipeHelper {
     
     <T extends Recipe<?>> void registerRecipes(Identifier category, Function<Recipe, Boolean> recipeFilter, Function<T, RecipeDisplay> mappingFunction);
     
-    List<RecipeHelperImpl.ScreenClickArea> getScreenClickAreas();
+    List<RecipeHelper.ScreenClickArea> getScreenClickAreas();
+    
+    interface ScreenClickArea {
+        Class<? extends AbstractContainerScreen> getScreenClass();
+        
+        Rectangle getRectangle();
+        
+        Identifier[] getCategories();
+    }
     
 }

+ 5 - 4
src/main/java/me/shedaniel/rei/api/plugins/REIPluginV0.java

@@ -5,7 +5,10 @@
 
 package me.shedaniel.rei.api.plugins;
 
-import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.api.DisplayHelper;
+import me.shedaniel.rei.api.ItemRegistry;
+import me.shedaniel.rei.api.REIPluginEntry;
+import me.shedaniel.rei.api.RecipeHelper;
 import net.fabricmc.loader.api.SemanticVersion;
 import net.fabricmc.loader.util.version.VersionParsingException;
 
@@ -15,10 +18,8 @@ public interface REIPluginV0 extends REIPluginEntry {
     
     /**
      * On register of the plugin
-     *
-     * @param pluginDisabler the helper class to disable other plugins
      */
-    default void onFirstLoad(PluginDisabler pluginDisabler) {
+    default void onFirstLoad() {
     }
     
     /**

+ 0 - 48
src/main/java/me/shedaniel/rei/client/PluginDisablerImpl.java

@@ -1,48 +0,0 @@
-/*
- * Roughly Enough Items by Danielshe.
- * Licensed under the MIT License.
- */
-
-package me.shedaniel.rei.client;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import me.shedaniel.rei.api.PluginDisabler;
-import me.shedaniel.rei.api.PluginFunction;
-import net.minecraft.util.Identifier;
-
-import java.util.List;
-import java.util.Map;
-
-public class PluginDisablerImpl implements PluginDisabler {
-    
-    private static Map<Identifier, List<PluginFunction>> pluginDisabledFunctions = Maps.newHashMap();
-    
-    @Override
-    public void disablePluginFunction(Identifier plugin, PluginFunction function) {
-        List<PluginFunction> list = Lists.newArrayList();
-        if (pluginDisabledFunctions.containsKey(plugin))
-            list = pluginDisabledFunctions.get(plugin);
-        if (!list.contains(function))
-            list.add(function);
-        pluginDisabledFunctions.put(plugin, list);
-    }
-    
-    @Override
-    public void enablePluginFunction(Identifier plugin, PluginFunction function) {
-        List<PluginFunction> list = Lists.newArrayList();
-        if (pluginDisabledFunctions.containsKey(plugin))
-            list = pluginDisabledFunctions.get(plugin);
-        if (list.contains(function))
-            list.remove(function);
-        pluginDisabledFunctions.put(plugin, list);
-        if (list.size() == 0)
-            pluginDisabledFunctions.remove(plugin);
-    }
-    
-    @Override
-    public boolean isFunctionEnabled(Identifier plugin, PluginFunction function) {
-        return !pluginDisabledFunctions.containsKey(plugin) || !pluginDisabledFunctions.get(plugin).contains(function);
-    }
-    
-}

+ 8 - 14
src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java

@@ -242,7 +242,6 @@ public class RecipeHelperImpl implements RecipeHelper {
         RoughlyEnoughItemsCore.LOGGER.info("[REI] Loading %d plugins: %s", plugins.size(), plugins.stream().map(REIPluginEntry::getPluginIdentifier).map(Identifier::toString).collect(Collectors.joining(", ")));
         Collections.reverse(plugins);
         RoughlyEnoughItemsCore.getItemRegisterer().getModifiableItemList().clear();
-        PluginDisabler pluginDisabler = RoughlyEnoughItemsCore.getPluginDisabler();
         Version reiVersion = FabricLoader.getInstance().getModContainer("roughlyenoughitems").get().getMetadata().getVersion();
         if (!(reiVersion instanceof SemanticVersion))
             RoughlyEnoughItemsCore.LOGGER.warn("[REI] Roughly Enough Items is not using semantic versioning, will be ignoring plugins' minimum versions!");
@@ -254,16 +253,11 @@ public class RecipeHelperImpl implements RecipeHelper {
                         if (((REIPluginV0) plugin).getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0) {
                             throw new IllegalStateException("Requires " + ((REIPluginV0) plugin).getMinimumVersion().getFriendlyString() + " REI version!");
                         }
-                    if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_CATEGORIES))
-                        ((REIPluginV0) plugin).registerPluginCategories(this);
-                    if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_RECIPE_DISPLAYS))
-                        ((REIPluginV0) plugin).registerRecipeDisplays(this);
-                    if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_BOUNDS))
-                        ((REIPluginV0) plugin).registerBounds(RoughlyEnoughItemsCore.getDisplayHelper());
-                    if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_OTHERS))
-                        ((REIPluginV0) plugin).registerOthers(this);
-                    if (pluginDisabler.isFunctionEnabled(identifier, PluginFunction.REGISTER_ITEMS))
-                        ((REIPluginV0) plugin).registerItems(RoughlyEnoughItemsCore.getItemRegisterer());
+                    ((REIPluginV0) plugin).registerPluginCategories(this);
+                    ((REIPluginV0) plugin).registerRecipeDisplays(this);
+                    ((REIPluginV0) plugin).registerBounds(RoughlyEnoughItemsCore.getDisplayHelper());
+                    ((REIPluginV0) plugin).registerOthers(this);
+                    ((REIPluginV0) plugin).registerItems(RoughlyEnoughItemsCore.getItemRegisterer());
                 } else {
                     throw new IllegalStateException("Invaild Plugin Class!");
                 }
@@ -381,7 +375,7 @@ public class RecipeHelperImpl implements RecipeHelper {
     
     @Override
     public void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen> screenClass, Identifier... categories) {
-        this.screenClickAreas.add(new ScreenClickArea(screenClass, rectangle, categories));
+        this.screenClickAreas.add(new ScreenClickAreaImpl(screenClass, rectangle, categories));
     }
     
     @Override
@@ -409,12 +403,12 @@ public class RecipeHelperImpl implements RecipeHelper {
         return screenClickAreas;
     }
     
-    public class ScreenClickArea {
+    private class ScreenClickAreaImpl implements ScreenClickArea {
         Class<? extends AbstractContainerScreen> screenClass;
         Rectangle rectangle;
         Identifier[] categories;
         
-        private ScreenClickArea(Class<? extends AbstractContainerScreen> screenClass, Rectangle rectangle, Identifier[] categories) {
+        private ScreenClickAreaImpl(Class<? extends AbstractContainerScreen> screenClass, Rectangle rectangle, Identifier[] categories) {
             this.screenClass = screenClass;
             this.rectangle = rectangle;
             this.categories = categories;

+ 2 - 11
src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java

@@ -6,8 +6,6 @@
 package me.shedaniel.rei.plugin;
 
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.PluginDisabler;
-import me.shedaniel.rei.api.PluginFunction;
 import me.shedaniel.rei.api.RecipeHelper;
 import me.shedaniel.rei.api.plugins.REIPluginV0;
 import me.shedaniel.rei.plugin.autocrafting.*;
@@ -30,17 +28,10 @@ public class DefaultAutoCraftingPlugin implements REIPluginV0 {
     }
     
     @Override
-    public void onFirstLoad(PluginDisabler pluginDisabler) {
+    public void registerOthers(RecipeHelper recipeHelper) {
         if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_ITEMS);
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_CATEGORIES);
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_RECIPE_DISPLAYS);
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_OTHERS);
+            return;
         }
-    }
-    
-    @Override
-    public void registerOthers(RecipeHelper recipeHelper) {
         recipeHelper.registerAutoCraftingHandler(new AutoCraftingTableBookHandler());
         recipeHelper.registerAutoCraftingHandler(new AutoInventoryBookHandler());
         recipeHelper.registerAutoCraftingHandler(new AutoFurnaceBookHandler());

+ 14 - 9
src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -91,17 +91,10 @@ public class DefaultPlugin implements REIPluginV0 {
     }
     
     @Override
-    public void onFirstLoad(PluginDisabler pluginDisabler) {
+    public void registerItems(ItemRegistry itemRegistry) {
         if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_ITEMS);
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_CATEGORIES);
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_RECIPE_DISPLAYS);
-            pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_OTHERS);
+            return;
         }
-    }
-    
-    @Override
-    public void registerItems(ItemRegistry itemRegistry) {
         Registry.ITEM.stream().forEach(item -> {
             itemRegistry.registerItemStack(item.getStackForRender());
             try {
@@ -122,6 +115,9 @@ public class DefaultPlugin implements REIPluginV0 {
     
     @Override
     public void registerPluginCategories(RecipeHelper recipeHelper) {
+        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
+            return;
+        }
         recipeHelper.registerCategory(new DefaultCraftingCategory());
         recipeHelper.registerCategory(new DefaultSmeltingCategory());
         recipeHelper.registerCategory(new DefaultSmokingCategory());
@@ -135,6 +131,9 @@ public class DefaultPlugin implements REIPluginV0 {
     
     @Override
     public void registerRecipeDisplays(RecipeHelper recipeHelper) {
+        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
+            return;
+        }
         recipeHelper.registerRecipes(CRAFTING, ShapelessRecipe.class, DefaultShapelessDisplay::new);
         recipeHelper.registerRecipes(CRAFTING, ShapedRecipe.class, DefaultShapedDisplay::new);
         recipeHelper.registerRecipes(SMELTING, SmeltingRecipe.class, DefaultSmeltingDisplay::new);
@@ -183,6 +182,9 @@ public class DefaultPlugin implements REIPluginV0 {
     
     @Override
     public void registerBounds(DisplayHelper displayHelper) {
+        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
+            return;
+        }
         displayHelper.getBaseBoundsHandler().registerExclusionZones(AbstractInventoryScreen.class, new DefaultPotionEffectExclusionZones());
         displayHelper.getBaseBoundsHandler().registerExclusionZones(RecipeBookProvider.class, new DefaultRecipeBookExclusionZones());
         displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<AbstractContainerScreen<?>>() {
@@ -282,6 +284,9 @@ public class DefaultPlugin implements REIPluginV0 {
     
     @Override
     public void registerOthers(RecipeHelper recipeHelper) {
+        if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
+            return;
+        }
         recipeHelper.registerWorkingStations(CRAFTING, new ItemStack(Items.CRAFTING_TABLE));
         recipeHelper.registerWorkingStations(SMELTING, new ItemStack(Items.FURNACE));
         recipeHelper.registerWorkingStations(SMOKING, new ItemStack(Items.SMOKER));

+ 129 - 35
src/main/resources/assets/roughlyenoughitems/lang/en_ud.json

@@ -1,40 +1,134 @@
 {
-  "key.rei.category": "sɯǝʇI ɥƃnouƎ ʎlɥƃnoɹ",
-  "key.roughlyenoughitems.recipe_keybind": "ǝdᴉɔǝɹ ʍoɥS",
-  "key.roughlyenoughitems.hide_keybind": "IƎɹ ʍoɥS/ǝpᴉH",
+  "key.rei.category": "sɯǝʇI ɥbnouƎ ʎןɥbnoᴚ",
+  "key.roughlyenoughitems.recipe_keybind": "ǝdıɔǝᴚ ʍoɥS",
+  "key.roughlyenoughitems.hide_keybind": "IƎᴚ ʍoɥS/ǝpıH",
   "key.roughlyenoughitems.usage_keybind": "sǝs∩ ʍoɥS",
-  "text.rei.cheat": "Cheat",
-  "text.rei.nocheat": "§c§mʇɐǝɥƆ",
-  "category.rei.crafting": "ƃuᴉʇɟɐɹƆ",
-  "category.rei.smelting": "ƃuᴉʇlǝɯS",
-  "category.rei.smelting.fuel": "lǝnℲ",
-  "category.rei.smoking": "ƃuᴉʞoɯS",
-  "category.rei.blasting": "ƃuᴉʇsɐlq",
-  "category.rei.campfire": "ǝɹᴉɟdɯɐƆ",
-  "category.rei.campfire.time": "spuoɔǝS %d",
-  "category.rei.stone_cutting": "ƃuᴉʇʇnƆ ǝuoʇS",
-  "category.rei.brewing": "ƃuᴉʍǝɹq",
-  "category.rei.brewing.input": "uoᴉʇoԀ lɐuᴉƃᴉɹO",
-  "category.rei.brewing.reactant": "ʇuǝᴉpǝɹƃuI",
-  "category.rei.brewing.result": "uoᴉʇoԀ pǝʇlnsǝɹ",
-  "text.rei.config": "ƃᴉɟuoƆ",
-  "text.rei.config.side_search_box": "xoq ɥɔɹɐǝS ǝpᴉS: ",
-  "text.rei.config.mirror_rei": "sʇǝƃpᴉM IƎɹ ɹoɹɹᴉW: ",
-  "text.rei.cheat_items": "˙{player_name} oʇ {item_count}x [{item_name}] uǝʌᴉפ",
-  "text.rei.failed_cheat_items": "§c˙sɯǝʇᴉ ǝʌᴉƃ oʇ pǝlᴉɐℲ",
-  "text.rei.config.list_ordering": "ƃuᴉɹǝpɹO ʇsᴉ˥ ɯǝʇI",
-  "text.rei.config.list_ordering_button": "%s [%s]",
-  "ordering.rei.ascending": "ƃuᴉpuǝɔs∀",
-  "ordering.rei.descending": "ƃuᴉpuǝɔsǝp",
-  "ordering.rei.registry": "ʎɹʇsᴉƃǝɹ",
+  "key.roughlyenoughitems.next_page": "ǝbɐԀ ʇxǝN",
+  "key.roughlyenoughitems.previous_page": "ǝbɐԀ snoıʌǝɹԀ",
+  "key.roughlyenoughitems.focus_search": "pןǝıℲ ɥɔɹɐǝS snɔoℲ",
+  "text.rei.config.general": "ןɐɹǝuǝƃ",
+  "text.rei.config.action": "uoıʇɔ∀",
+  "text.rei.config.cheating": ":buıʇɐǝɥϽ",
+  "text.rei.cheating": "buıʇɐǝɥϽ",
+  "text.rei.cheating_disabled": "§7pǝןqɐsıᗡ buıʇɐǝɥϽ",
+  "text.rei.cheating_enabled": "§cpǝןqɐuƎ buıʇɐǝɥϽ",
+  "text.rei.cheating_limited_enabled": "§b(spuɐɯɯoϽ buıs∩) pǝןqɐuƎ buıʇɐǝɥϽ",
+  "text.rei.cheating_enabled_no_perms": "§7(uoıssıɯɹǝԀ oN) §cpǝןqɐuƎ §7buıʇɐǝɥϽ",
+  "text.rei.no_permission_cheat": "sɯǝʇı ʇɐǝɥɔ oʇ pǝɹınbǝɹ ǝɹɐ suoıssıɯɹǝd ɹoʇɐɹǝdO",
+  "category.rei.crafting": "buıʇɟɐɹϽ",
+  "category.rei.smelting": "buıʇןǝɯS",
+  "category.rei.smelting.fuel": "ןǝnℲ",
+  "category.rei.smoking": "buıʞoɯS",
+  "category.rei.blasting": "buıʇsɐןq",
+  "category.rei.campfire": "ǝɹıɟdɯɐϽ",
+  "category.rei.campfire.time": "spuoɔǝS p%",
+  "category.rei.stone_cutting": "buıʇʇnϽ ǝuoʇS",
+  "category.rei.brewing": "buıʍǝɹq",
+  "category.rei.brewing.input": "uoıʇoԀ ןɐuıbıɹO",
+  "category.rei.brewing.reactant": "ʇuǝıpǝɹbuI",
+  "category.rei.brewing.result": "uoıʇoԀ pǝʇןnsǝᴚ",
+  "category.rei.composting": "buıʇsodɯoϽ",
+  "category.rei.stripping": "buıddıɹʇS",
+  "text.rei.composting.chance": "§eǝɔuɐɥϽ %%d%",
+  "text.rei.composting.page": "p% ǝbɐԀ",
+  "text.rei.config": "bıɟuoϽ",
+  "text.rei.config_tooltip": "uǝǝɹɔS bıɟuoϽ uǝdO\n§7ǝpoɯ ʇɐǝɥɔ ǝןbboʇ oʇ ʞɔıןϽ-ʇɟıɥS",
+  "text.rei.config.side_search_box": " :uoıʇısoԀ xoq ɥɔɹɐǝS",
+  "text.rei.config.item_list_position": " :uoıʇısoԀ ʇsı˥ ɯǝʇI",
+  "text.rei.config.item_list_position.left": "ʇɟǝ˥",
+  "text.rei.config.item_list_position.right": "ʇɥbıᴚ",
+  "text.rei.cheat_items": "§7˙{player_name} oʇ {item_count}x [{item_name}§7] ǝʌɐƃ",
+  "text.rei.failed_cheat_items": "§c˙sɯǝʇı ǝʌıb oʇ pǝןıɐℲ",
+  "text.rei.config.list_ordering": ":buıɹǝpɹO ʇsı˥ ɯǝʇI",
+  "text.rei.config.list_ordering_button": "[%2$s] %1$s",
+  "ordering.rei.ascending": "buıpuǝɔs∀",
+  "ordering.rei.descending": "buıpuǝɔsǝᗡ",
+  "ordering.rei.registry": "ʎɹʇsıbǝᴚ",
   "ordering.rei.name": "ǝɯɐN",
-  "ordering.rei.item_groups": "sdnoɹפ ɯǝʇI",
-  "text.auto_craft.failed_move_items": "§c¡sɯǝʇᴉ ǝʌoɯ ʇ,uɐƆ",
+  "ordering.rei.item_groups": "sdnoɹƃ ɯǝʇI",
   "text.auto_craft.move_items": "sɯǝʇI ǝʌoW",
-  "text.rei.config.enable_craftable_only": "ɹǝʇlᴉℲ ǝlqɐʇɟɐɹƆ ǝlqɐuƎ: ",
-  "text.rei.showing_craftable": "ǝlqɐʇɟɐɹƆ ƃuᴉʍoɥS",
-  "text.rei.showing_all": "ll∀ ƃuᴉʍoɥS",
-  "text.rei.delete_items": "§cɯǝʇI ǝʇǝlǝp",
-  "text.rei.check_updates": "sǝʇɐpd∩ ʞɔǝɥƆ: ",
-  "text.rei.credits": "sʇᴉpǝɹƆ"
+  "error.rei.transfer.too_small": "˙pıɹb ᄅxᄅ ɐ oʇ sɯǝʇı ǝʌoɯ oʇ ǝןqɐu∩",
+  "error.rei.not.on.server": "˙ɹǝʌɹǝs ǝɥʇ uo ʇou sı IƎᴚ",
+  "error.rei.not.enough.materials": "˙sןɐıɹǝʇɐW ɥbnouƎ ʇoN",
+  "text.rei.config.craftable_only": " :ɹǝʇןıℲ ǝןqɐʇɟɐɹϽ",
+  "text.rei.config.clickable_recipe_arrows": " :sʍoɹɹ∀ ǝdıɔǝᴚ ǝןqɐʞɔıןϽ",
+  "text.rei.config.text.true": "pǝןqɐuƎ",
+  "text.rei.config.text.false": "pǝןqɐsıᗡ",
+  "text.rei.showing_craftable": "ǝןqɐʇɟɐɹϽ buıʍoɥS",
+  "text.rei.showing_all": "ןן∀ buıʍoɥS",
+  "text.rei.delete_items": "§cɯǝʇI ǝʇǝןǝᗡ",
+  "text.rei.check_updates": " :sǝʇɐpd∩ ʞɔǝɥϽ",
+  "text.rei.config.load_default_plugin": " :uıbnןԀ ʇןnɐɟǝᗡ pɐo˥",
+  "text.rei.config.load_default_plugin.restart_tooltip": "˙sıɥʇ ǝןqɐsıp oʇ ʇuɐʍ ɹǝʌǝu ʎןqɐqoɹd noʎ\n˙buıʇʇǝs sıɥʇ ʎןddɐ oʇ ʇɟɐɹɔǝuıW ʇɹɐʇsǝᴚu",
+  "text.rei.credits": "sʇıpǝɹϽ",
+  "text.rei.left_arrow": "<",
+  "text.rei.right_arrow": ">",
+  "text.rei.give_command": ":puɐɯɯoϽ ǝʌıƃ ʇɐǝɥϽ",
+  "text.rei.gamemode_command": ":puɐɯɯoϽ ǝpoW ǝɯɐƃ",
+  "text.rei.weather_command": ":puɐɯɯoϽ ɹǝɥʇɐǝM",
+  "text.rei.give_command.tooltip": "˙buıʇɐǝɥɔ uǝɥʍ sɹǝʌɹǝs uı pǝsn ʎןuo sı puɐɯɯoɔ sıɥ⊥",
+  "text.rei.give_command.suggestion": "˙puɐɯɯoɔ ɹǝʇuƎ",
+  "text.rei.view_all_categories": "sǝıɹobǝʇɐϽ ןן∀ ʍǝıΛ",
+  "text.rei.go_back_first_page": "1 ǝbɐԀ oʇ ʞɔɐq",
+  "text.rei.config.appearance": "ǝɔuɐɹɐǝdd∀",
+  "text.rei.config.modules": "sǝןnpoW",
+  "text.rei.config.advanced": "pǝɔuɐʌp∀",
+  "text.rei.config.vanilla_recipe_book": ":ʞooq ǝdıɔǝᴚ ɐןןıuɐΛ",
+  "text.rei.choose_page": "ǝbɐԀ ǝsooɥϽ",
+  "text.rei.config.max_recipes_per_page": ":ǝbɐԀ ɥɔɐƎ sǝdıɔǝᴚ ɯnɯıxɐW",
+  "text.rei.config.util_buttons": ":suoʇʇnq sןıʇ∩",
+  "text.rei.gamemode_button.tooltip": "ǝpoW ǝɯɐƃ ɥɔʇıʍS\n§7ǝpoɯ %s oʇ ɥɔʇıʍS.\n\n§7˙ǝןɔʎɔ ǝsɹǝʌǝɹ ɐ uı ɥɔʇıʍs oʇ ʞɔıןϽ-ʇɟıɥS",
+  "text.rei.weather_button.tooltip": "ɹǝɥʇɐǝM ɥɔʇıʍS\n§7˙%s oʇ ɥɔʇıʍS.",
+  "text.rei.enabled": "sǝʎ",
+  "text.rei.disabled": "oN",
+  "text.rei.short_gamemode.survival": "S",
+  "text.rei.short_gamemode.creative": "Ͻ",
+  "text.rei.short_gamemode.adventure": "∀",
+  "text.rei.short_gamemode.spectator": "ԀS",
+  "text.rei.weather.clear": "ɹɐǝןϽ",
+  "text.rei.weather.rain": "uıɐᴚ",
+  "text.rei.weather.thunder": "ɹǝpunɥ⊥",
+  "text.rei.previous_category": "ʎɹobǝʇɐϽ snoıʌǝɹԀ",
+  "text.rei.next_category": "ʎɹobǝʇɐϽ ʇxǝN",
+  "text.rei.previous_page": "ǝbɐԀ snoıʌǝɹԀ",
+  "text.rei.next_page": "ǝbɐԀ ʇxǝN",
+  "text.rei.config.prefer_visible_recipes": " :sǝdıɔǝᴚ ǝןqısıΛ ɹǝɟǝɹԀ",
+  "text.rei.config.title": "bıɟuoϽ sɯǝʇI ɥbnouƎ ʎןɥbnoᴚ",
+  "text.rei.config.enable_legacy_speedcraft_support": " :ʇɹoddnS uıbnןԀ ʎɔɐbǝ˥ ǝןqɐuƎ",
+  "text.rei.config.april_fools": "sןooℲ ןıɹd∀",
+  "text.rei.config.april_fools.2019": " :ǝʞoظ ,sןooℲ ןıɹd∀ IƎᴚ 9102 ǝɔɹoℲ",
+  "text.rei.config.appearance_theme": ":ǝɯǝɥ⊥ ǝɔuɐɹɐǝdd∀",
+  "text.rei.config.appearance_theme.true": "ǝɯǝɥ⊥ ʞɹɐᗡ",
+  "text.rei.config.appearance_theme.false": "ǝɯǝɥ⊥ ʇɥbı˥",
+  "text.rei.config.villager_screen_permanent_scroll_bar": ":ɹɐq ןןoɹɔS uǝǝɹɔS ǝdıɔǝᴚ",
+  "text.rei.config.item_cheating_mode": ":ʇunoɯ∀ buıʇɐǝɥϽ ɯǝʇI",
+  "text.rei.config.item_cheating_mode.rei_like": "ןɐɯɹoN",
+  "text.rei.config.item_cheating_mode.jei_like": "pǝsɹǝʌǝᴚ",
+  "text.rei.config.light_gray_recipe_border": ":ɹǝpɹoq ʎɐןdsıᗡ ǝdıɔǝᴚ",
+  "text.rei.config_api_failed": "¡pǝןןɐʇsuı ʇı ǝʌɐɥ ʇ,uop noʎ ɹo pǝןıɐɟ IԀ∀ 2ʌ bıɟuoϽ ɥʇoןϽ ɟı ɹǝɥʇıǝ ǝɹǝɥ pǝʌıɹɹɐ noʎ\n˙ɹǝʞɔɐɹʇ bnq ǝɥʇ oʇ ʇɹodǝɹ puɐ IԀ∀ ǝɥʇ ןןɐʇsuI / ǝʇɐpd∩u",
+  "text.rei.back": "ʞɔɐq",
+  "text.rei.config.recipe_screen_type": ":ǝdʎ⊥ uǝǝɹɔS",
+  "text.rei.config.recipe_screen_type.unset": "ʇǝS ʇoN",
+  "text.rei.config.recipe_screen_type.original": "ןɐuıbıɹO",
+  "text.rei.config.recipe_screen_type.villager": "ɹǝbɐןןıΛ",
+  "text.rei.select": "ʇɔǝןǝS",
+  "text.rei.working_station": "uoıʇɐʇS buıʞɹoM",
+  "text.rei.recipe_id": "\n%2$s :pI ǝdıɔǝᴚ%1$s",
+  "text.rei.config.register_in_other_thread": ":pɐǝɹɥʇ ɹǝɥʇo uı sǝdıɔǝᴚ ɹǝʇsıbǝᴚ",
+  "text.rei.recipe_screen_type.selection": "uoıʇɔǝןǝS ǝdʎ⊥ uǝǝɹɔS ǝdıɔǝᴚ",
+  "text.rei.recipe_screen_type.selection.sub": "˙uǝǝɹɔs bıɟuoɔ ǝɥʇ ɐıʌ uıɐbɐ buıʇʇǝs sıɥʇ ʇıpǝ sʎɐʍןɐ uɐɔ noʎ",
+  "text.rei.view_recipes_for": "s% ɹoɟ sǝdıɔǝᴚ ʍǝıΛ",
+  "text.rei.config.side_search_box.text.false": "ɹǝʇuǝϽ",
+  "text.rei.config.side_search_box.text.true": "ʇɥbıᴚ / ʇɟǝ˥",
+  "text.rei.config.villager_screen_permanent_scroll_bar.text.true": "ʇuǝuɐɯɹǝԀ",
+  "text.rei.config.villager_screen_permanent_scroll_bar.text.false": "ǝpɐℲ oʇn∀",
+  "text.rei.config.light_gray_recipe_border.text.true": "ʎɐɹƃ ʇɥbı˥",
+  "text.rei.config.light_gray_recipe_border.text.false": "ʇsɐɹʇuoϽ ɥbıH",
+  "_comment": "sdıʇןoo⊥ bıɟuoϽ",
+  "tooltip.rei.config.side_search_box": "pןǝıɟ ɥɔɹɐǝs ǝɥʇ ɟo uoıʇɐɔoן ǝɥʇ sǝɹɐןɔǝᗡ",
+  "tooltip.rei.config.list_ordering": "ʇsıן ɯǝʇı ǝpıs ǝɥʇ ɟo buıɹǝpɹo ǝɥʇ sǝɹɐןɔǝᗡ",
+  "tooltip.rei.config.item_list_position": "ʇsıן ɯǝʇı ǝpıs ǝɥʇ ɟo uoıʇısod ǝɥʇ sǝɹɐןɔǝᗡ",
+  "tooltip.rei.config.max_recipes_per_page": "sǝdıɔǝɹ pǝʎɐןdsıp ǝןqıssod ɯnɯıxɐɯ ǝɥʇ sǝɹɐןɔǝᗡ",
+  "tooltip.rei.config.light_gray_recipe_border": "ɹǝpɹoq ǝdıɔǝɹ ǝɥʇ ɟo ǝɔuɐɹɐǝddɐ ǝɥʇ sǝɹɐןɔǝᗡ",
+  "text.rei.credit.text": "§l(%sʌ) sɯǝʇI ɥbnouƎ ʎןɥbnoᴚ\n§7˙sɯǝʇI ɥbnouƎ ʇsoɯן∀ ɹoɟ ʞɹoɟ ɐ ʎןןɐuıbıɹO\n\n§lsɹǝdoןǝʌǝᗡ\n  ɐʌɹɐᗡuǝZ ʎq ʎןןɐuıbıɹO\n  ǝɥsןǝıuɐᗡ ʎq uǝʇʇıɹʍǝᴚ\n  ʇnNɥǝ⊥ ʎq ʇɹoddnS uıbnןԀ pןO\n\n§luoıʇɐןsuɐɹ⊥ ǝbɐnbuɐ˥\n%s\n\n§lǝsuǝɔı˥\n§7˙⊥IW ɥʇıʍ pǝsuǝɔıן sı sɯǝʇI ɥbnouƎ ʎןɥbnoᴚ"
 }

+ 131 - 37
src/main/resources/assets/roughlyenoughitems/lang/lol_us.json

@@ -1,40 +1,134 @@
 {
-  "key.rei.category": "Roughly Enough Items",
-  "key.roughlyenoughitems.recipe_keybind": "Show Recipe",
-  "key.roughlyenoughitems.hide_keybind": "Hide/Show REI",
+  "key.rei.category": "Woughwy Enough Items",
+  "key.roughlyenoughitems.recipe_keybind": "Show Wecipe",
+  "key.roughlyenoughitems.hide_keybind": "Hide/Show WEI",
   "key.roughlyenoughitems.usage_keybind": "Show Uses",
-  "text.rei.config.cheating": "HAX:",
-  "text.rei.cheating": "HAX",
-  "category.rei.crafting": "Krafting",
-  "category.rei.smelting": "Smlezting",
-  "category.rei.smelting.fuel": "Fuelz",
-  "category.rei.smoking": "Soking",
-  "category.rei.blasting": "Blazting",
-  "category.rei.campfire": "Camfireh",
-  "category.rei.campfire.time": "%d Secondz",
-  "category.rei.stone_cutting": "Rock Kuting",
-  "category.rei.brewing": "Brwing",
-  "category.rei.brewing.input": "Original Poshun",
-  "category.rei.brewing.reactant": "Thing",
-  "category.rei.brewing.result": "Resuted Poshun",
-  "text.rei.config": "Konfig",
-  "text.rei.config.side_search_box": "Sie Saerhc Boz: ",
-  "text.rei.config.mirror_rei": "Miror REI Widgetz: ",
-  "text.rei.cheat_items": "Giv [{item_name}] x{item_count} 2 {player_name}.",
-  "text.rei.failed_cheat_items": "§cFaild 2 giv itemz.",
-  "text.rei.config.list_ordering": "Item lis orderin",
+  "key.roughlyenoughitems.next_page": "Next Page",
+  "key.roughlyenoughitems.previous_page": "Pwevious Page",
+  "key.roughlyenoughitems.focus_search": "Focus Seawch Fiewd",
+  "text.rei.config.general": "Genewaw",
+  "text.rei.config.action": "Action",
+  "text.rei.config.cheating": "Cheating:",
+  "text.rei.cheating": "Cheating",
+  "text.rei.cheating_disabled": "§7Cheating Disabwed",
+  "text.rei.cheating_enabled": "§cCheating Enabwed",
+  "text.rei.cheating_limited_enabled": "§bCheating Enabwed (Using Commands)",
+  "text.rei.cheating_enabled_no_perms": "§7Cheating §cEnabwed §7(No Pewmission)",
+  "text.rei.no_permission_cheat": "Opewatow pewmissions awe wequiwed to cheat items",
+  "category.rei.crafting": "Cwafting",
+  "category.rei.smelting": "Smewting",
+  "category.rei.smelting.fuel": "Fuew",
+  "category.rei.smoking": "Smoking",
+  "category.rei.blasting": "Bwasting",
+  "category.rei.campfire": "Campfiwe",
+  "category.rei.campfire.time": "%d Seconds",
+  "category.rei.stone_cutting": "Stone Cutting",
+  "category.rei.brewing": "Bwewing",
+  "category.rei.brewing.input": "Owiginaw Potion",
+  "category.rei.brewing.reactant": "Ingwedient",
+  "category.rei.brewing.result": "Wesuwted Potion",
+  "category.rei.composting": "Composting",
+  "category.rei.stripping": "Stwipping",
+  "text.rei.composting.chance": "§e%d%% Chance",
+  "text.rei.composting.page": "Page %d",
+  "text.rei.config": "Config",
+  "text.rei.config_tooltip": "Open Config Scween\n§7Shift-Cwick to toggwe cheat mode",
+  "text.rei.config.side_search_box": "Seawch Box Position: ",
+  "text.rei.config.item_list_position": "Item Wist Position: ",
+  "text.rei.config.item_list_position.left": "Weft",
+  "text.rei.config.item_list_position.right": "Wight",
+  "text.rei.cheat_items": "Gave [{item_name}§f] x{item_count} to {pwayew_name}.",
+  "text.rei.failed_cheat_items": "§cFaiwed to give items.",
+  "text.rei.config.list_ordering": "Item Wist Owdewing:",
   "text.rei.config.list_ordering_button": "%s [%s]",
-  "ordering.rei.ascending": "Acendin",
-  "ordering.rei.descending": "Dscendin",
-  "ordering.rei.registry": "Registry",
-  "ordering.rei.name": "Nam",
-  "ordering.rei.item_groups": "Itmz groupz",
-  "text.auto_craft.failed_move_items": "§cKan'z m0v itemz!",
-  "text.auto_craft.move_items": "M0v Itemz",
-  "text.rei.config.enable_craftable_only": "Enabel craftabel fit3r: ",
-  "text.rei.showing_craftable": "Sowin Craftabel",
-  "text.rei.showing_all": "Sowin all",
-  "text.rei.delete_items": "§cDel Itm",
-  "text.rei.check_updates": "Chck Updatez: ",
-  "text.rei.credits": "Creditz"
-}
+  "ordering.rei.ascending": "Ascending",
+  "ordering.rei.descending": "Descending",
+  "ordering.rei.registry": "Wegistwy",
+  "ordering.rei.name": "Name",
+  "ordering.rei.item_groups": "Item Gwoups",
+  "text.auto_craft.move_items": "Move Items",
+  "error.rei.transfer.too_small": "Unabwe to move items to a 2x2 gwid.",
+  "error.rei.not.on.server": "WEI is not on de sewvew.",
+  "error.rei.not.enough.materials": "Not Enough Matewiaws.",
+  "text.rei.config.craftable_only": "Cwaftabwe Fiwtew: ",
+  "text.rei.config.clickable_recipe_arrows": "Cwickabwe Wecipe Awwows: ",
+  "text.rei.config.text.true": "Enabwed",
+  "text.rei.config.text.false": "Disabwed",
+  "text.rei.showing_craftable": "Showing Cwaftabwe",
+  "text.rei.showing_all": "Showing Aww",
+  "text.rei.delete_items": "§cDewete Item",
+  "text.rei.check_updates": "Check Updates: ",
+  "text.rei.config.load_default_plugin": "Woad Defauwt Pwugin: ",
+  "text.rei.config.load_default_plugin.restart_tooltip": "You pwobabwy nevew want to disabwe dis.\nWestawt Minecwaft to appwy dis setting.",
+  "text.rei.credits": "Cwedits",
+  "text.rei.left_arrow": "<",
+  "text.rei.right_arrow": ">",
+  "text.rei.give_command": "Cheat Give Command:",
+  "text.rei.gamemode_command": "Game Mode Command:",
+  "text.rei.weather_command": "Weadew Command:",
+  "text.rei.give_command.tooltip": "Dis command is onwy used in sewvews when cheating.",
+  "text.rei.give_command.suggestion": "Entew command.",
+  "text.rei.view_all_categories": "View Aww Categowies",
+  "text.rei.go_back_first_page": "Back to Page 1",
+  "text.rei.config.appearance": "Appeawance",
+  "text.rei.config.modules": "Moduwes",
+  "text.rei.config.advanced": "Advanced",
+  "text.rei.config.vanilla_recipe_book": "Vaniwwa Wecipe Book:",
+  "text.rei.choose_page": "Choose Page",
+  "text.rei.config.max_recipes_per_page": "Maximum Wecipes Each Page:",
+  "text.rei.config.util_buttons": "Utiws Buttons:",
+  "text.rei.gamemode_button.tooltip": "Switch Game Mode\n§7Switch to %s mode.\n\n§7Shift-Cwick to switch in a wevewse cycwe.",
+  "text.rei.weather_button.tooltip": "Switch Weadew\n§7Switch to %s.",
+  "text.rei.enabled": "Yes",
+  "text.rei.disabled": "No",
+  "text.rei.short_gamemode.survival": "S",
+  "text.rei.short_gamemode.creative": "C",
+  "text.rei.short_gamemode.adventure": "A",
+  "text.rei.short_gamemode.spectator": "SP",
+  "text.rei.weather.clear": "Cweaw",
+  "text.rei.weather.rain": "Wain",
+  "text.rei.weather.thunder": "Dundew",
+  "text.rei.previous_category": "Pwevious Categowy",
+  "text.rei.next_category": "Next Categowy",
+  "text.rei.previous_page": "Pwevious Page",
+  "text.rei.next_page": "Next Page",
+  "text.rei.config.prefer_visible_recipes": "Pwefew Visibwe Wecipes: ",
+  "text.rei.config.title": "Woughwy Enough Items Config",
+  "text.rei.config.enable_legacy_speedcraft_support": "Enabwe Wegacy Pwugin Suppowt: ",
+  "text.rei.config.april_fools": "Apwiw Foows",
+  "text.rei.config.april_fools.2019": "Fowce 2019 WEI Apwiw Foows' joke: ",
+  "text.rei.config.appearance_theme": "Appeawance Deme:",
+  "text.rei.config.appearance_theme.true": "Dawk Deme",
+  "text.rei.config.appearance_theme.false": "Wight Deme",
+  "text.rei.config.villager_screen_permanent_scroll_bar": "Wecipe Scween Scwoww Baw:",
+  "text.rei.config.item_cheating_mode": "Item Cheating Amount:",
+  "text.rei.config.item_cheating_mode.rei_like": "Nowmaw",
+  "text.rei.config.item_cheating_mode.jei_like": "Wevewsed",
+  "text.rei.config.light_gray_recipe_border": "Wecipe Dispway Bowdew:",
+  "text.rei.config_api_failed": "You awwived hewe eidew if Cwod Config v2 API faiwed ow you don't have it instawwed!\nUpdate / Instaww de API and wepowt to de bug twackew.",
+  "text.rei.back": "Back",
+  "text.rei.config.recipe_screen_type": "Scween Type:",
+  "text.rei.config.recipe_screen_type.unset": "Not Set",
+  "text.rei.config.recipe_screen_type.original": "Owiginaw",
+  "text.rei.config.recipe_screen_type.villager": "Viwwagew",
+  "text.rei.select": "Sewect",
+  "text.rei.working_station": "Wowking Station",
+  "text.rei.recipe_id": "\n%sWecipe Id: %s",
+  "text.rei.config.register_in_other_thread": "Wegistew Wecipes in odew dwead:",
+  "text.rei.recipe_screen_type.selection": "Wecipe Scween Type Sewection",
+  "text.rei.recipe_screen_type.selection.sub": "You can awways edit dis setting again via de config scween.",
+  "text.rei.view_recipes_for": "View Wecipes fow %s",
+  "text.rei.config.side_search_box.text.false": "Centew",
+  "text.rei.config.side_search_box.text.true": "Weft / Wight",
+  "text.rei.config.villager_screen_permanent_scroll_bar.text.true": "Pewmanent",
+  "text.rei.config.villager_screen_permanent_scroll_bar.text.false": "Auto Fade",
+  "text.rei.config.light_gray_recipe_border.text.true": "Wight Gway",
+  "text.rei.config.light_gray_recipe_border.text.false": "High Contwast",
+  "_comment": "Config Toowtips",
+  "tooltip.rei.config.side_search_box": "Decwawes de wocation of de seawch fiewd",
+  "tooltip.rei.config.list_ordering": "Decwawes de owdewing of de side item wist",
+  "tooltip.rei.config.item_list_position": "Decwawes de position of de side item wist",
+  "tooltip.rei.config.max_recipes_per_page": "Decwawes de maximum possibwe dispwayed wecipes",
+  "tooltip.rei.config.light_gray_recipe_border": "Decwawes de appeawance of de wecipe bowdew",
+  "text.rei.credit.text": "§wWoughwy Enough Items (v%s)\n§7Owiginawwy a fowk fow Awmost Enough Items.\n\n§wDevewopews\n  Owiginawwy by ZenDawva\n  Wewwitten by Daniewshe\n  Owd Pwugin Suppowt by TehNut\n\n§wWanguage Twanswation\n%s\n\n§wWicense\n§7Woughwy Enough Items is wicensed wid MIT."
+}