package com.tinesoft.droidlinguist.server.tools; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.tinesoft.droidlinguist.server.json.translation.source.PluralItem; import com.tinesoft.droidlinguist.server.json.translation.source.SourceItem; import com.tinesoft.droidlinguist.server.json.translation.source.StringItemType; import com.tinesoft.droidlinguist.server.json.translation.target.TranslationFile; import com.tinesoft.droidlinguist.server.json.translation.target.TranslationState; import com.tinesoft.droidlinguist.server.json.translation.target.TranslationStringItem; import com.tinesoft.droidlinguist.server.json.translation.target.TranslationStringItemValue; import com.tinesoft.droidlinguist.server.translator.api.common.NoTranslator; import com.tinesoft.droidlinguist.server.translator.api.common.Translator; /** * Component responsible for creating the translation for each source string. * * @author Tine Kondo * */ @Component public class TranslationMaker { private static final Logger LOG = LoggerFactory.getLogger(TranslationMaker.class); @Autowired private NoTranslator noTranslator; public TranslationFile translate(Collection<SourceItem> strings, String sourceLang, String targetLang, Translator translator) { LOG.info("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"); LOG.info(" >>> Start translating strings from '{}' to '{}' using '{}'...", new Object[] { sourceLang, targetLang, translator.getType().getName() }); List<TranslationStringItem> translatedStrings = new ArrayList<>(strings.size()); boolean allSourceStringsTranslated = true; List<String> errors = new ArrayList<String>(); // check language support by the given translator boolean isLangSupported = true; if (!translator.isLangSupported(sourceLang)) { isLangSupported = false; errors.add("Source Language is not (yet) supported by " + translator.getType().getName()); } if (!translator.isLangSupported(targetLang)) { isLangSupported = false; errors.add("Target Language is not (yet) supported by " + translator.getType().getName()); } for (SourceItem si : strings) { List<String> sourceTexts = si.getValueAsText(); List<String> targetTexts = si.isTranslatable() ? // (isLangSupported ? translator.translate(sourceTexts, sourceLang, targetLang) : // noTranslator.translate(sourceTexts, sourceLang, targetLang)) : new ArrayList<String>(sourceTexts); List<TranslationStringItemValue> values = new ArrayList<>(); TranslationStringItem tsi = new TranslationStringItem(); tsi.setName(si.getName()); tsi.setType(si.getType()); tsi.setTranslatable(si.isTranslatable()); tsi.setValues(values); boolean allItemValuesTranslated = targetTexts.stream().noneMatch(t -> StringUtils.isNotBlank(t)); allSourceStringsTranslated &= allItemValuesTranslated; StringItemType type = StringItemType.getByName(si.getType()); String state; switch (type) { case STRING: state = StringUtils.isNotBlank(targetTexts.get(0)) ? TranslationState.AWAITING_VALIDATION.getCode() : TranslationState.REQUEST_TRANSLATION .getCode(); values.add(new TranslationStringItemValue(targetTexts.get(0), state)); tsi.setValues(values); break; case STRING_ARRAY: for (String text : targetTexts) { state = StringUtils.isNotBlank(text) ? TranslationState.AWAITING_VALIDATION.getCode() : TranslationState.REQUEST_TRANSLATION.getCode(); values.add(new TranslationStringItemValue(text, state)); } break; case PLURALS: PluralItem pi = (PluralItem) si; List<PluralItem.Value> pvalues = pi.getValues(); for (int i = 0; i < pvalues.size(); i++) { state = StringUtils.isNotBlank(targetTexts.get(i)) ? TranslationState.AWAITING_VALIDATION.getCode() : TranslationState.REQUEST_TRANSLATION.getCode(); values.add(new TranslationStringItemValue(pvalues.get(i).getQuantity(), targetTexts.get(i), state)); } break; } translatedStrings.add(tsi); } TranslationFile tf = new TranslationFile(); tf.setTargetLang(targetLang); tf.setStrings(translatedStrings); tf.setErrors(errors); tf.setState((allSourceStringsTranslated ? TranslationState.AWAITING_VALIDATION : TranslationState.REQUEST_TRANSLATION).getCode()); LOG.info(" <<< Done translating strings."); return tf; } }