package com.austinv11.collectiveframework.language; import com.austinv11.collectiveframework.language.translation.ITranslationProvider; import com.austinv11.collectiveframework.language.translation.QueryLimitException; import com.austinv11.collectiveframework.language.translation.TranslationException; import com.austinv11.collectiveframework.language.translation.YandexProvider; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * A class for translating text */ public class TranslationManager { private static final List<ITranslationProvider> translators = new ArrayList<ITranslationProvider>(); //The cost of using free APIs private static final List<String> unusableProviders = new ArrayList<String>(); //Helps reduce queries private static final HashMap<String, String> translationCache = new HashMap<String,String>(); static { registerTranslationProvider(new YandexProvider()); } /** * Register a translation provider, note: the earlier the registration, the higher priority it has * @param provider The translation provider */ public static void registerTranslationProvider(ITranslationProvider provider) { translators.add(provider); } /** * Translates a given text (either from the unlocalized key or from standard text) * @param text String to translate * @param toLang Language to translate to * @return The translated text * @throws TranslationException * @throws IOException */ public static String translate(String text, String toLang) throws TranslationException, IOException { if (translationCache.containsKey(text)) return translationCache.get(text); ITranslationProvider provider; int i = 0; while (unusableProviders.contains(translators.get(i).getProviderName()) || !translators.get(i).canDetectLanguage()) { i++; if (!translators.contains(i)) throw new TranslationException(TranslationException.ErrorTypes.NO_VALID_PROVIDERS); } provider = translators.get(i); try { String translation = provider.translate(text, toLang); translationCache.put(text, translation); return translation; } catch (QueryLimitException e) { unusableProviders.add(provider.getProviderName()); return translate(text, toLang); } } /** * Translates a given text (either from the unlocalized key or from standard text) * @param text String to translate * @param fromLang Language the string is from * @param toLang Language to translate to * @return The translated text * @throws TranslationException * @throws IOException */ public static String translate(String text, String fromLang, String toLang) throws TranslationException, IOException { if (translationCache.containsKey(text)) return translationCache.get(text); ITranslationProvider provider; int i = 0; while (unusableProviders.contains(translators.get(i).getProviderName())) { i++; if (!translators.contains(i)) throw new TranslationException(TranslationException.ErrorTypes.NO_VALID_PROVIDERS); } provider = translators.get(i); try { String translation = provider.translate(text, fromLang, toLang); translationCache.put(text, translation); return translation; } catch (QueryLimitException e) { unusableProviders.add(provider.getProviderName()); return translate(text, fromLang, toLang); } } /** * Method which attempts to detect the language of the given string * @param text String to detect the language for * @return Language code * @throws TranslationException * @throws IOException */ public static String detectLanguage(String text) throws TranslationException, IOException { ITranslationProvider provider; int i = 0; while (unusableProviders.contains(translators.get(i).getProviderName())) { i++; if (!translators.contains(i)) throw new TranslationException(TranslationException.ErrorTypes.NO_VALID_PROVIDERS); } provider = translators.get(i); try { return provider.detectLangauge(text); } catch (QueryLimitException e) { unusableProviders.add(provider.getProviderName()); return detectLanguage(text); } } }