I18nDictionaryMachineTranslation.java 10.6 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.translation.api.TranslationConstants
 *  com.adobe.granite.translation.api.TranslationConstants$ContentType
 *  com.adobe.granite.translation.api.TranslationException
 *  com.adobe.granite.translation.api.TranslationResult
 *  com.adobe.granite.translation.api.TranslationService
 *  com.google.gson.Gson
 *  com.google.gson.GsonBuilder
 *  com.google.gson.JsonElement
 *  com.google.gson.JsonObject
 *  com.google.gson.JsonParser
 *  javax.jcr.Binary
 *  javax.jcr.Node
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.ValueFactory
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.wcm.translation.impl;

import com.adobe.cq.wcm.translation.impl.I18nDictionary;
import com.adobe.cq.wcm.translation.impl.I18nDictionaryTranslator;
import com.adobe.cq.wcm.translation.impl.TranslationRuleConfigurationFile;
import com.adobe.cq.wcm.translation.impl.TranslationUtils;
import com.adobe.granite.translation.api.TranslationConstants;
import com.adobe.granite.translation.api.TranslationException;
import com.adobe.granite.translation.api.TranslationResult;
import com.adobe.granite.translation.api.TranslationService;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.ValueFactory;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class I18nDictionaryMachineTranslation
extends I18nDictionaryTranslator {
    private static final Logger log = LoggerFactory.getLogger(I18nDictionaryMachineTranslation.class);
    private Set<String> cacheList = null;
    private HashMap<String, String> dictEntries = null;

    public I18nDictionaryMachineTranslation(TranslationRuleConfigurationFile ruleFile, TranslationService tSvc, ResourceResolver resourceResolver) {
        super(ruleFile, tSvc, resourceResolver);
        log.trace("In function: I18nDictionaryMachineTranslation");
        this.cacheList = new HashSet<String>();
        this.dictEntries = new HashMap();
    }

    public boolean translateI18nDictionary(ResourceResolver resourceResolver, Resource i18nDict) throws RepositoryException, TranslationException, IOException {
        log.trace("In function: translateI18nDictionary");
        boolean bSave = false;
        if (this.processI18nDictTranslationNode(i18nDict)) {
            bSave = this.translateStrings(resourceResolver, i18nDict);
        }
        return bSave;
    }

    public boolean createAndTranslateI18nComponentStringDict(ArrayList<Resource> pageList) {
        log.trace("In function: createAndTranslateI18nComponentStringDict");
        boolean bSave = false;
        try {
            ResourceResolver resourceResolver;
            Resource i18nDict;
            String language;
            HashMap<String, String> componentStringMap = this.extractComponentStringMapFromResourceList(pageList);
            if (componentStringMap != null && componentStringMap.size() > 0 && (i18nDict = I18nDictionary.getOrCreateI18nDictionaryResource(resourceResolver = pageList.get(0).getResourceResolver(), "/apps/i18n/", language = this.ruleFile.getDestinationLanguage(), null, true)) != null) {
                resourceResolver.commit();
                for (Map.Entry<String, String> componentStringEntry : componentStringMap.entrySet()) {
                    String key = componentStringEntry.getKey();
                    String value = componentStringEntry.getValue();
                    this.dictEntries.put(key, value);
                    this.cacheList.add(value);
                }
                if (I18nDictionary.addEntriesToDict(i18nDict, this.dictEntries)) {
                    bSave = this.translateStrings(resourceResolver, i18nDict);
                }
            }
        }
        catch (Exception ignored) {
            // empty catch block
        }
        return bSave;
    }

    private boolean translateStrings(ResourceResolver resourceResolver, Resource i18nDict) throws TranslationException, RepositoryException, UnsupportedEncodingException {
        log.trace("In function: translateStrings");
        String contentCategory = this.tSvc.getDefaultCategory();
        String strSrcLang = this.ruleFile.getSourceLanguage();
        String strDstLang = this.ruleFile.getDestinationLanguage();
        TranslationConstants.ContentType contentType = TranslationConstants.ContentType.HTML;
        String[] strStringArrayToTranslate = this.cacheList.toArray(new String[this.cacheList.size()]);
        TranslationResult[] tResultArray = this.tSvc.translateArray(strStringArrayToTranslate, strSrcLang, strDstLang, contentType, contentCategory);
        return this.saveTranslatedStrings(tResultArray, resourceResolver, i18nDict);
    }

    private boolean saveTranslatedStrings(TranslationResult[] tResultArray, ResourceResolver resourceResolver, Resource i18nDict) throws UnsupportedEncodingException, RepositoryException {
        log.trace("In function: saveTranslatedStrings");
        if (TranslationUtils.checkFileExtension((Node)i18nDict.adaptTo(Node.class), ".json")) {
            return this.saveTranslatedStringToJSON(tResultArray, i18nDict);
        }
        return this.saveTranslatedStringsToJCR(tResultArray, resourceResolver);
    }

    private boolean saveTranslatedStringToJSON(TranslationResult[] tResultArray, Resource i18nDict) throws UnsupportedEncodingException, RepositoryException {
        log.trace("In function: saveTranslatedStringToJSON");
        boolean bSave = false;
        InputStream srcJsonStream = (InputStream)i18nDict.adaptTo(InputStream.class);
        InputStreamReader srcJsonReader = new InputStreamReader(srcJsonStream, "UTF-8");
        JsonParser parser = new JsonParser();
        JsonObject srcJsonObject = parser.parse((Reader)srcJsonReader).getAsJsonObject();
        HashMap<String, TranslationResult> resultMap = this.convertTranslationResultArrayToMap(tResultArray);
        for (Map.Entry<String, String> entry : this.dictEntries.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            TranslationResult result = resultMap.get(value);
            if (result == null || !srcJsonObject.has(key)) continue;
            srcJsonObject.addProperty(key, result.getTranslation());
            bSave = true;
        }
        if (bSave) {
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            ByteArrayInputStream translatedJsonStream = new ByteArrayInputStream(gson.toJson((JsonElement)srcJsonObject).getBytes(Charset.forName("UTF-8")));
            Node jsonJcrContent = ((Node)i18nDict.adaptTo(Node.class)).getNode("jcr:content");
            jsonJcrContent.setProperty("jcr:data", jsonJcrContent.getSession().getValueFactory().createBinary((InputStream)translatedJsonStream));
        }
        return bSave;
    }

    private boolean saveTranslatedStringsToJCR(TranslationResult[] tResultArray, ResourceResolver resourceResolver) {
        log.trace("In function: saveTranslatedStringsToJCR");
        boolean bSave = false;
        try {
            HashMap<String, TranslationResult> resultMap = this.convertTranslationResultArrayToMap(tResultArray);
            for (Map.Entry<String, String> entry : this.dictEntries.entrySet()) {
                Resource resource;
                String key = entry.getKey();
                String value = entry.getValue();
                TranslationResult result = resultMap.get(value);
                if (result == null || (resource = resourceResolver.getResource(key)) == null) continue;
                ((Node)resource.adaptTo(Node.class)).setProperty("sling:message", result.getTranslation());
                bSave = true;
            }
        }
        catch (RepositoryException e) {
            log.error("Can't save translation result", (Throwable)e);
        }
        return bSave;
    }

    private HashMap<String, TranslationResult> convertTranslationResultArrayToMap(TranslationResult[] tResultArray) {
        log.trace("In function: convertTranslationResultArrayToMap");
        HashMap<String, TranslationResult> resultMap = new HashMap<String, TranslationResult>();
        for (TranslationResult translationResult : tResultArray) {
            resultMap.put(translationResult.getSourceString(), translationResult);
        }
        return resultMap;
    }

    @Override
    protected boolean processI18nJson(Resource i18nJsonDict) {
        log.trace("In function: processI18nJson");
        boolean bSave = false;
        JsonParser parser = new JsonParser();
        InputStream jsonStream = (InputStream)i18nJsonDict.adaptTo(InputStream.class);
        try {
            InputStreamReader srcReader = new InputStreamReader(jsonStream, "UTF-8");
            JsonObject srcJsonObject = parser.parse((Reader)srcReader).getAsJsonObject();
            Set srcJsonEntries = srcJsonObject.entrySet();
            for (Map.Entry entry : srcJsonEntries) {
                String key = (String)entry.getKey();
                String value = ((JsonElement)entry.getValue()).getAsString();
                this.dictEntries.put(key, value);
                this.cacheList.add(value);
                bSave = true;
            }
        }
        catch (UnsupportedEncodingException e) {
            log.error("Failed to parse {}", (Object)i18nJsonDict.getPath(), (Object)e);
        }
        return bSave;
    }

    @Override
    protected boolean processI18nJcrNodes(Resource i18nJcrDict) {
        log.trace("In function: processI18nJcrNodes");
        boolean bSave = false;
        ArrayList<Resource> jcrEntries = I18nDictionary.getI18nJCREntryResourceList(i18nJcrDict);
        for (Resource jcrEntry : jcrEntries) {
            String key = jcrEntry.getPath();
            String value = TranslationUtils.getAttribute(jcrEntry, "sling:message", String.class);
            this.dictEntries.put(key, value);
            this.cacheList.add(value);
            bSave = true;
        }
        return bSave;
    }
}