/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.ctask.general; import org.apache.log4j.Logger; import org.dspace.content.MetadataValue; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.curate.AbstractCurationTask; import org.dspace.curate.Curator; import org.dspace.curate.Distributive; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * MicrosoftTranslator translates stuff * * @author Kim Shepherd */ @Distributive public abstract class AbstractTranslator extends AbstractCurationTask { protected int status = Curator.CURATE_UNSET; protected final String PLUGIN_PREFIX = "translator"; protected String authLangField = "dc.language"; protected String authLang = "en"; protected String[] toTranslate; protected String[] langs; protected String apiKey = ""; private static Logger log = Logger.getLogger(AbstractTranslator.class); protected List<String> results = new ArrayList<String>(); private final transient ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); @Override public void init(Curator curator, String taskId) throws IOException { super.init(curator, taskId); // Load configuration authLang = configurationService.getProperty("default.locale"); authLangField = configurationService.getProperty(PLUGIN_PREFIX + ".field.language"); String[] toTranslate = configurationService.getArrayProperty(PLUGIN_PREFIX + ".field.targets"); String[] langs = configurationService.getArrayProperty(PLUGIN_PREFIX + ".language.targets"); if(!(toTranslate.length > 0 && langs.length > 0)) { status = Curator.CURATE_ERROR; results.add("Configuration error"); setResult(results.toString()); report(results.toString()); return; } initApi(); } @Override public int perform(DSpaceObject dso) throws IOException { if(dso instanceof Item) { Item item = (Item) dso; /* * We lazily set success here because our success or failure * is per-field, not per-item */ status = Curator.CURATE_SUCCESS; String handle = item.getHandle(); log.debug("Translating metadata for " + handle); List<MetadataValue> authLangs = itemService.getMetadataByMetadataString(item, authLangField); if(authLangs.size() > 0) { /* Assume the first... multiple "authoritative" languages won't work */ authLang = authLangs.get(0).getValue(); log.debug("Authoritative language for " + handle + " is " + authLang); } for(String lang : langs) { lang = lang.trim(); for(String field : toTranslate) { boolean translated = false; field = field.trim(); String[] fieldSegments = field.split("\\."); List<MetadataValue> fieldMetadata = null; if(fieldSegments.length > 2) { // First, check to see if we've already got this in the target language List<MetadataValue> checkMetadata = itemService.getMetadata(item, fieldSegments[0], fieldSegments[1], fieldSegments[2], lang); if(checkMetadata.size() > 0) { // We've already translated this, move along log.debug(handle + "already has " + field + " in " + lang + ", skipping"); results.add(handle + ": Skipping " + lang + " translation " + "(" + field + ")"); translated = true; } // Let's carry on and get the authoritative version, then fieldMetadata = itemService.getMetadata(item, fieldSegments[0], fieldSegments[1], fieldSegments[2], authLang); } else { // First, check to see if we've already got this in the target language List<MetadataValue> checkMetadata = itemService.getMetadata(item, fieldSegments[0], fieldSegments[1], null, lang); if(checkMetadata.size() > 0) { // We've already translated this, move along log.debug(handle + "already has " + field + " in " + lang + ", skipping"); results.add(handle + ": Skipping " + lang + " translation " + "(" + field + ")"); translated = true; } // Let's carry on and get the authoritative version, then fieldMetadata = itemService.getMetadata(item, fieldSegments[0], fieldSegments[1], null, authLang); } if(!translated && fieldMetadata.size() > 0) { for(MetadataValue metadataValue : fieldMetadata) { String value = metadataValue.getValue(); String translatedText = translateText(authLang, lang, value); if(translatedText != null && !"".equals(translatedText)) { try { // Add the new metadata if(fieldSegments.length > 2) { itemService.addMetadata(Curator.curationContext(), item, fieldSegments[0], fieldSegments[1], fieldSegments[2], lang, translatedText); } else { itemService.addMetadata(Curator.curationContext(), item, fieldSegments[0], fieldSegments[1], null, lang, translatedText); } itemService.update(Curator.curationContext(), item); results.add(handle + ": Translated " + authLang + " -> " + lang + " (" + field + ")"); } catch(Exception e) { log.info(e.getLocalizedMessage()); status = Curator.CURATE_ERROR; } } else { results.add(handle + ": Failed translation of " + authLang + " -> " + lang + "(" + field + ")"); } } } } } } processResults(); return status; } protected void initApi() { /* * Override this method in your translator * Only needed to set key, etc. * apiKey = ConfigurationManager.getProperty(PLUGIN_PREFIX, "translator.api.key.[service]"); * */ } protected String translateText(String from, String to, String text) throws IOException { // Override this method in your translator return null; } private void processResults() throws IOException { StringBuilder sb = new StringBuilder(); sb.append("Translation report: \n----------------\n"); for(String result : results) { sb.append(result).append("\n"); } setResult(sb.toString()); report(sb.toString()); } }