package io.gitlab.jfronny.translater.transformer; import com.github.vbauer.yta.model.Direction; import com.github.vbauer.yta.model.Language; import com.github.vbauer.yta.service.YTranslateApiImpl; import io.gitlab.jfronny.translater.Translater; import org.apache.commons.lang3.StringUtils; import java.util.Random; import java.util.Set; //The actual translation methods public class YnTransformer implements ITransformer { private static Random rnd; private static YTranslateApiImpl api; private static Set languages; @Override public String transform(String str) { try { 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(transform(s.substring(1)).replace("%", "")); } else res.append(transform(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(transform(s.substring(1)).replace("$", "")); } else res.append(transform(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(transform(s.substring(1)).replace("§", "")); } else res.append(transform(s)); f = false; } return res.toString(); } else { return Break(str); } } 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"); throw e; } } private String Break(String str) { try { if (invalid(str)) return str; Language startLang = StringUtils.isAlpha(Translater.cfg.targetLanguage) && Translater.cfg.targetLanguage.length() == 2 ? Language.of(Translater.cfg.targetLanguage) : api.detectionApi().detect(str).orElse(Language.EN); if (invalid(startLang.code())) { Translater.Warn("Could not detect language for: " + str); Translater.Warn("Defaulting to EN"); startLang = Language.EN; } String currentState = str; Language currentLang = startLang; for (int i = 0; i < Translater.cfg.rounds; i++) { Language newLang = selectRandom(); currentState = api.translationApi().translate(currentState, Direction.of(Translater.cfg.breakFully ? selectRandom() : currentLang, newLang)).text(); currentLang = newLang; } currentState = api.translationApi().translate(currentState, startLang).text(); if (Translater.Cli()) Translater.Log("Transformed: \"" + str + "\" to: \"" + currentState + "\""); return currentState; } catch (Exception e) { Translater.Warn("Failed to break: " + str + " (" + str.length() + " characters)"); Translater.Warn("Please report this bug with the mod containing the lang file"); throw e; } } private boolean invalid(String str) { if (str.length() < 2) return true; for (char c : str.toCharArray()) { String tmp = "" + c; if (StringUtils.isAlphanumeric(tmp)) return false; } return true; } private Language selectRandom() { return languages.stream().skip(rnd.nextInt(languages.size())).findFirst().get(); } 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"); } } }