Reflection bad. (Also some null-safety in GoogleService to avoid exceptions, might cause problems later)

This commit is contained in:
JFronny 2021-06-21 16:11:29 +02:00
parent bcc9512288
commit 38d411ef9d
No known key found for this signature in database
GPG Key ID: BEC5ACBBD4EE17E5
6 changed files with 30 additions and 31 deletions

View File

@ -1,43 +1,20 @@
package io.gitlab.jfronny.translater.mixin;
import io.gitlab.jfronny.translater.Translater;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.MappingResolver;
import net.minecraft.client.resource.language.TranslationStorage;
import net.minecraft.util.Language;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.lang.reflect.Field;
import java.util.Map;
//This is where the actual magic happens
@Mixin(Language.class)
public class LanguageMixin {
private static final MappingResolver mr = FabricLoader.getInstance().getMappingResolver();
private static final Field FIELD = FieldUtils.getField(TranslationStorage.class,
mr.mapFieldName("intermediary",
"net.minecraft.class_1078",
"field_5330",
"Ljava/util/Map;"),
true);
@Inject(at = @At("HEAD"), method = "setInstance")
private static void languageSetInstance(Language language, CallbackInfo ci) {
if (FIELD == null) {
Translater.LOGGER.warn("Could not set language map, field not found");
return;
}
if (language instanceof TranslationStorage) {
try {
FIELD.set(language, Translater.getMap((Map<String, String>) FIELD.get(language)));
} catch (IllegalAccessException | ClassCastException e) {
e.printStackTrace();
}
if (language instanceof TranslationStorage t) {
TranslationStorageAccessor ta = (TranslationStorageAccessor) t;
ta.setTranslations(Translater.getMap(ta.getTranslations()));
}
}
}

View File

@ -26,7 +26,8 @@ public class Plugin implements IMixinConfigPlugin {
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
Libjf.registerConfig(Translater.MOD_ID, Cfg.class);
if (Objects.equals(mixinClassName, LanguageMixin.class.getName()))
if (Objects.equals(mixinClassName, LanguageMixin.class.getName())
|| Objects.equals(mixinClassName, TranslationStorageAccessor.class.getName()))
return true;
else if (Objects.equals(mixinClassName, MinecraftClientMixin.class.getName()))
return Translater.Gui();

View File

@ -0,0 +1,18 @@
package io.gitlab.jfronny.translater.mixin;
import net.minecraft.client.resource.language.TranslationStorage;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Map;
@Mixin(TranslationStorage.class)
public interface TranslationStorageAccessor {
@Mutable
@Accessor("translations")
void setTranslations(Map<String, String> translations);
@Accessor("translations")
Map<String, String> getTranslations();
}

View File

@ -7,9 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.Random;
import java.util.Set;
//The actual translation methods
public class TranslatingTransformer<T> implements ITransformer {
private final Random rnd;
private final Collection<T> languages;

View File

@ -40,6 +40,8 @@ public class GoogleService {
}
public static String translate(String textToTranslate, String translateFrom, String translateTo) {
if (textToTranslate == null)
return null;
String pageSource = "";
try {
pageSource = getPageSource(textToTranslate, translateFrom, translateTo);
@ -66,8 +68,10 @@ public class GoogleService {
private static String getPageSource(String textToTranslate, String translateFrom, String translateTo)
throws Exception {
if (textToTranslate == null)
return null;
String pageUrl = String.format("https://translate.google.com/m?hl=en&sl=%s&tl=%s&ie=UTF-8&prev=_m&q=%s",
translateFrom, translateTo, URLEncoder.encode(textToTranslate.trim(), "UTF-8"));
translateFrom, translateTo, URLEncoder.encode(textToTranslate.trim(), StandardCharsets.UTF_8));
URL url = new URL(pageUrl);
HttpURLConnection connection = null;
BufferedReader bufferedReader = null;

View File

@ -7,7 +7,8 @@
"client": [
"LanguageMixin",
"MinecraftClientMixin",
"SplashScreenMixin"
"SplashScreenMixin",
"TranslationStorageAccessor"
],
"injectors": {
"defaultRequire": 1