115 lines
4.4 KiB
Java
115 lines
4.4 KiB
Java
package io.gitlab.jfronny.translater;
|
|
|
|
import com.github.vbauer.yta.model.Direction;
|
|
import com.github.vbauer.yta.model.Language;
|
|
import com.github.vbauer.yta.model.Languages;
|
|
import com.github.vbauer.yta.service.YTranslateApiImpl;
|
|
import com.sun.org.apache.xpath.internal.operations.Mod;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import java.util.*;
|
|
|
|
public class YnTransformer extends CachingTransformer {
|
|
|
|
private static YTranslateApiImpl api = null;
|
|
private static Set<Language> languages = null;
|
|
private static final Random rnd = new Random();
|
|
|
|
@Override
|
|
public String getTransformed(String str) {
|
|
try {
|
|
if (api == null)
|
|
api = new YTranslateApiImpl(ModInit.cfg.key);
|
|
if (languages == null)
|
|
languages = api.languageApi().all().languages();
|
|
if (str.contains("%")) {
|
|
StringBuilder res = new StringBuilder();
|
|
boolean f = true;
|
|
for (String s : str.split("%")) {
|
|
if (!f) {
|
|
res.append("%");
|
|
if (s.length() > 0)
|
|
res.append(s.charAt(0)).append(getTransformed(s.substring(1)).replace("%", ""));
|
|
} else
|
|
res.append(getTransformed(s));
|
|
f = false;
|
|
}
|
|
return res.toString();
|
|
}
|
|
else if (str.contains("$")) {
|
|
StringBuilder res = new StringBuilder();
|
|
boolean f = true;
|
|
for (String s : str.split("\\$")) {
|
|
if (!f) {
|
|
res.append("$").append(s.charAt(0)).append(getTransformed(s.substring(1)).replace("$", ""));
|
|
} else
|
|
res.append(getTransformed(s));
|
|
f = false;
|
|
}
|
|
return res.toString();
|
|
}
|
|
else if (str.contains("§")) {
|
|
StringBuilder res = new StringBuilder();
|
|
boolean f = true;
|
|
for (String s : str.split("§")) {
|
|
if (!f) {
|
|
res.append("§").append(s.charAt(0)).append(getTransformed(s.substring(1)).replace("§", ""));
|
|
} else
|
|
res.append(getTransformed(s));
|
|
f = false;
|
|
}
|
|
return res.toString();
|
|
}
|
|
else {
|
|
return Break(str);
|
|
}
|
|
} catch (Exception e) {
|
|
ModInit.Warn("Failed to transform: " + str + " (" + str.length() + " characters)");
|
|
ModInit.Warn("Please report this bug with the mod containing the lang file");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
private String Break(String str) {
|
|
try {
|
|
if (!valid(str))
|
|
return str;
|
|
Language startLang = api.detectionApi().detect(str).orElse(Language.EN);
|
|
if (!valid(startLang.code())) {
|
|
ModInit.Warn("Could not detect language for: " + str);
|
|
ModInit.Warn("Defaulting to EN");
|
|
startLang = Language.EN;
|
|
}
|
|
String currentState = str;
|
|
Language currentLang = startLang;
|
|
for (int i = 0; i < ModInit.cfg.rounds; i++) {
|
|
Language newLang = selectRandom();
|
|
currentState = api.translationApi().translate(currentState, Direction.of(ModInit.cfg.breakFully ? selectRandom() : currentLang, newLang)).text();
|
|
currentLang = newLang;
|
|
}
|
|
currentState = api.translationApi().translate(currentState, startLang).text();
|
|
ModInit.Log("Transformed: \"" + str + "\" to: \"" + currentState + "\"");
|
|
return currentState;
|
|
} catch (Exception e) {
|
|
ModInit.Warn("Failed to break: " + str + " (" + str.length() + " characters)");
|
|
ModInit.Warn("Please report this bug with the mod containing the lang file");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
private boolean valid(String str) {
|
|
if (str.length() < 2)
|
|
return false;
|
|
for (char c : str.toCharArray()) {
|
|
String tmp = "" + c;
|
|
if (StringUtils.isAlphanumeric(tmp))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private Language selectRandom() {
|
|
return languages.stream().skip(rnd.nextInt(languages.size())).findFirst().get();
|
|
}
|
|
}
|