Reflection bad. (Also some null-safety in GoogleService to avoid exceptions, might cause problems later)
This commit is contained in:
parent
bcc9512288
commit
38d411ef9d
|
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
"client": [
|
||||
"LanguageMixin",
|
||||
"MinecraftClientMixin",
|
||||
"SplashScreenMixin"
|
||||
"SplashScreenMixin",
|
||||
"TranslationStorageAccessor"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
|
|
Loading…
Reference in New Issue