Translater/src/main/java/io/gitlab/jfronny/translater/transformer/YnTransformer.java

123 lines
4.8 KiB
Java
Raw Normal View History

2020-08-07 12:47:37 +02:00
package io.gitlab.jfronny.translater.transformer;
2020-07-10 15:51:27 +02:00
import com.github.vbauer.yta.model.Direction;
import com.github.vbauer.yta.model.Language;
import com.github.vbauer.yta.service.YTranslateApiImpl;
2020-08-07 12:47:37 +02:00
import io.gitlab.jfronny.translater.Translater;
2020-07-10 20:46:39 +02:00
import org.apache.commons.lang3.StringUtils;
2020-07-10 15:51:27 +02:00
2020-07-10 21:24:20 +02:00
import java.util.Random;
import java.util.Set;
2020-07-10 15:51:27 +02:00
2020-08-07 12:47:37 +02:00
//The actual translation methods
public class YnTransformer implements ITransformer {
private static Random rnd;
private static YTranslateApiImpl api;
private static Set<Language> languages;
2020-07-10 15:51:27 +02:00
@Override
2020-08-07 12:47:37 +02:00
public String transform(String str) {
2020-07-10 20:46:39 +02:00
try {
if (str.contains("%")) {
StringBuilder res = new StringBuilder();
boolean f = true;
for (String s : str.split("%")) {
if (!f) {
res.append("%");
if (s.length() > 0)
2020-08-07 12:47:37 +02:00
res.append(s.charAt(0)).append(transform(s.substring(1)).replace("%", ""));
2020-07-10 20:46:39 +02:00
} else
2020-08-07 12:47:37 +02:00
res.append(transform(s));
2020-07-10 20:46:39 +02:00
f = false;
}
return res.toString();
2020-07-10 21:24:20 +02:00
} else if (str.contains("$")) {
2020-07-10 20:46:39 +02:00
StringBuilder res = new StringBuilder();
boolean f = true;
for (String s : str.split("\\$")) {
if (!f) {
2020-08-07 12:47:37 +02:00
res.append("$").append(s.charAt(0)).append(transform(s.substring(1)).replace("$", ""));
2020-07-10 20:46:39 +02:00
} else
2020-08-07 12:47:37 +02:00
res.append(transform(s));
2020-07-10 20:46:39 +02:00
f = false;
}
return res.toString();
2020-07-10 21:24:20 +02:00
} else if (str.contains("§")) {
2020-07-10 20:46:39 +02:00
StringBuilder res = new StringBuilder();
boolean f = true;
for (String s : str.split("§")) {
if (!f) {
2020-08-07 12:47:37 +02:00
res.append("§").append(s.charAt(0)).append(transform(s.substring(1)).replace("§", ""));
2020-07-10 20:46:39 +02:00
} else
2020-08-07 12:47:37 +02:00
res.append(transform(s));
2020-07-10 20:46:39 +02:00
f = false;
}
return res.toString();
2020-07-10 21:24:20 +02:00
} else {
2020-07-10 20:46:39 +02:00
return Break(str);
}
2020-08-07 12:47:37 +02:00
}
catch (Exception e) {
Translater.Warn("Failed to transform: " + str + " (" + str.length() + " characters)");
Translater.Warn("Please report this bug with the mod containing the lang file");
2020-07-10 20:46:39 +02:00
throw e;
2020-07-10 16:21:12 +02:00
}
}
private String Break(String str) {
try {
2020-07-13 17:16:06 +02:00
if (invalid(str))
2020-07-10 16:21:12 +02:00
return str;
2020-08-07 12:47:37 +02:00
Language startLang = StringUtils.isAlpha(Translater.cfg.targetLanguage) && Translater.cfg.targetLanguage.length() == 2
? Language.of(Translater.cfg.targetLanguage)
: api.detectionApi().detect(str).orElse(Language.EN);
2020-07-13 17:16:06 +02:00
if (invalid(startLang.code())) {
2020-08-07 12:47:37 +02:00
Translater.Warn("Could not detect language for: " + str);
Translater.Warn("Defaulting to EN");
2020-07-10 20:46:39 +02:00
startLang = Language.EN;
}
2020-07-10 16:21:12 +02:00
String currentState = str;
Language currentLang = startLang;
2020-08-07 12:47:37 +02:00
for (int i = 0; i < Translater.cfg.rounds; i++) {
2020-07-10 16:21:12 +02:00
Language newLang = selectRandom();
2020-08-07 12:47:37 +02:00
currentState = api.translationApi().translate(currentState, Direction.of(Translater.cfg.breakFully ? selectRandom() : currentLang, newLang)).text();
2020-07-10 16:21:12 +02:00
currentLang = newLang;
}
currentState = api.translationApi().translate(currentState, startLang).text();
2020-08-07 12:47:37 +02:00
if (Translater.Cli())
Translater.Log("Transformed: \"" + str + "\" to: \"" + currentState + "\"");
2020-07-10 16:21:12 +02:00
return currentState;
} catch (Exception e) {
2020-08-07 12:47:37 +02:00
Translater.Warn("Failed to break: " + str + " (" + str.length() + " characters)");
Translater.Warn("Please report this bug with the mod containing the lang file");
2020-07-10 16:21:12 +02:00
throw e;
2020-07-10 15:51:27 +02:00
}
}
2020-07-13 17:16:06 +02:00
private boolean invalid(String str) {
2020-07-10 20:46:39 +02:00
if (str.length() < 2)
2020-07-13 17:16:06 +02:00
return true;
2020-07-10 20:46:39 +02:00
for (char c : str.toCharArray()) {
String tmp = "" + c;
if (StringUtils.isAlphanumeric(tmp))
2020-07-13 17:16:06 +02:00
return false;
2020-07-10 20:46:39 +02:00
}
2020-07-13 17:16:06 +02:00
return true;
2020-07-10 20:46:39 +02:00
}
2020-07-10 15:51:27 +02:00
private Language selectRandom() {
return languages.stream().skip(rnd.nextInt(languages.size())).findFirst().get();
}
2020-08-07 12:47:37 +02:00
public YnTransformer() {
try {
rnd = new Random();
api = new YTranslateApiImpl(Translater.cfg.key);
languages = api.languageApi().all(Language.EN).languages();
} catch (Exception e) {
Translater.Warn("Failed to initialize transformer. Is your API key valid?");
Translater.Warn("Minecraft will continue but issues should be expected");
}
}
2020-07-10 15:51:27 +02:00
}