package com.tyndalehouse.step.tools.international; import com.memetix.mst.language.Language; import com.memetix.mst.translate.Translate; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Enumeration; import java.util.Locale; import java.util.Properties; import java.util.ResourceBundle; import java.util.regex.Pattern; /** * Integration to Microsoft translate */ public class TranslateSTEP { public static final String[] BUNDLES = new String[]{"HtmlBundle", "InteractiveBundle", "ErrorBundle", "SetupBundle"}; private static final Pattern PERCENT_SIGN = Pattern.compile("% %"); private static final Pattern PERCENT_SIGN_FOLLOW = Pattern.compile("([^%]\\s+)(%\\s)(\\w)"); private static final Pattern LESS_THAN = Pattern.compile("<"); private static final Pattern GREATER_THAN = Pattern.compile(">"); private static final Pattern TAG_START = Pattern.compile("<\\s+"); private static final Pattern TAG_END = Pattern.compile("/ >"); private static final Pattern MARKER = Pattern.compile("\\$ "); public static void main(String[] args) throws IOException { Translate.setContentType("text/html"); Translate.setClientId(args[0]); Translate.setClientSecret(args[1]); final String sourceLanguage = args[2]; final String targetLanguage = args[3]; for (String s : BUNDLES) { Properties target = new Properties(); final ResourceBundle bundle = ResourceBundle.getBundle(s, Locale.forLanguageTag(sourceLanguage)); final ResourceBundle englishBundle = ResourceBundle.getBundle(s, Locale.forLanguageTag("en")); final Enumeration<String> keys = bundle.getKeys(); while (keys.hasMoreElements()) { final String k = keys.nextElement(); final String value = bundle.getString(k); final String englishValue = englishBundle.getString(k); translate(sourceLanguage, targetLanguage, target, k, value, englishValue); // break; } final FileOutputStream fileOutputStream = new FileOutputStream(new File("c:\\dev\\projects\\step\\step-core\\src\\main\\resources\\" + s + "_" + targetLanguage + ".properties")); target.store(fileOutputStream, ""); fileOutputStream.close(); } } private static void translate(final String sourceLanguage, final String targetLanguage, final Properties target, final String k, final String value, final String englishValue) { if (value.equals(englishValue)) { //converting from English System.out.println("Converting from English"); translate(target, "en", targetLanguage, k, value); } else { //converting from other language System.out.println("Converting from " + sourceLanguage); translate(target, sourceLanguage, targetLanguage, k, value); } } private static void translate(final Properties bundle, final String sourceLanguage, final String targetLanguage, final String k, final String value) { Language source = Language.fromString(sourceLanguage); Language target = Language.fromString(targetLanguage); System.out.printf("Translating %s[%s] from %s to %s\n", k, value, source.toString(), target.toString()); String translatedText = null; try { translatedText = Translate.execute(value, source, target); bundle.put(k, cleanupText(translatedText)); } catch (Exception e) { System.out.println("Unable to translate " + k + " " + value); } } public static String cleanupText(final String translatedText) { return PERCENT_SIGN_FOLLOW.matcher( PERCENT_SIGN.matcher(MARKER.matcher(TAG_END.matcher(TAG_START.matcher(GREATER_THAN.matcher(LESS_THAN.matcher(translatedText).replaceAll("<")).replaceAll(">")).replaceAll("<")).replaceAll("/>")).replaceAll("\\$")).replaceAll("%%")) .replaceAll("$1$3"); } }