package net.minecraft.client.resources.language; import com.mojang.logging.LogUtils; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.locale.DeprecatedTranslationsInfo; import net.minecraft.locale.Language; import net.minecraft.network.chat.FormattedText; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.util.FormattedCharSequence; import org.slf4j.Logger; @Environment(EnvType.CLIENT) public class ClientLanguage extends Language { private static final Logger LOGGER = LogUtils.getLogger(); private final Map storage; private final boolean defaultRightToLeft; private ClientLanguage(Map storage, boolean defaultRightToLeft) { this.storage = storage; this.defaultRightToLeft = defaultRightToLeft; } public static ClientLanguage loadFrom(ResourceManager resourceManager, List filenames, boolean defaultRightToLeft) { Map map = new HashMap(); for (String string : filenames) { String string2 = String.format(Locale.ROOT, "lang/%s.json", string); for (String string3 : resourceManager.getNamespaces()) { try { ResourceLocation resourceLocation = ResourceLocation.fromNamespaceAndPath(string3, string2); appendFrom(string, resourceManager.getResourceStack(resourceLocation), map); } catch (Exception var10) { LOGGER.warn("Skipped language file: {}:{} ({})", string3, string2, var10.toString()); } } } DeprecatedTranslationsInfo.loadFromDefaultResource().applyToMap(map); return new ClientLanguage(Map.copyOf(map), defaultRightToLeft); } private static void appendFrom(String languageName, List resources, Map destinationMap) { for (Resource resource : resources) { try { InputStream inputStream = resource.open(); try { Language.loadFromJson(inputStream, destinationMap::put); } catch (Throwable var9) { if (inputStream != null) { try { inputStream.close(); } catch (Throwable var8) { var9.addSuppressed(var8); } } throw var9; } if (inputStream != null) { inputStream.close(); } } catch (IOException var10) { LOGGER.warn("Failed to load translations for {} from pack {}", languageName, resource.sourcePackId(), var10); } } } @Override public String getOrDefault(String key, String defaultValue) { return (String)this.storage.getOrDefault(key, defaultValue); } @Override public boolean has(String id) { return this.storage.containsKey(id); } @Override public boolean isDefaultRightToLeft() { return this.defaultRightToLeft; } @Override public FormattedCharSequence getVisualOrder(FormattedText text) { return FormattedBidiReorder.reorder(text, this.defaultRightToLeft); } }