package org.solovyev.android.translations;
import org.apache.commons.cli.*;
import org.apache.http.util.TextUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Android {
public static void main(String... args) throws Exception {
final Options options = new Options();
options.addOption(Option.builder("prefix").hasArg().desc("Local location of Android project").required(false).build());
options.addOption(Option.builder("project").hasArg().desc("Local location of Android project").build());
options.addOption(Option.builder("resources").hasArg().desc("String identifiers to be copied").build());
options.addOption(Option.builder("output").hasArg().desc("Output folder").required().build());
options.addOption(Option.builder("languages").hasArg().desc("Comma-separated list of languages for translation").required().build());
final CommandLineParser parser = new DefaultParser();
final CommandLine commandLine = parser.parse(options, args);
final File[] projects;
if (commandLine.hasOption("project")) {
final String[] projectPaths = commandLine.getOptionValues("project");
projects = new File[projectPaths.length];
for (int i = 0; i < projectPaths.length; i++) {
projects[i] = makeInputDirectory(projectPaths[i]);
}
} else {
projects = null;
}
final String prefix = makePrefix(commandLine.getOptionValue("prefix"));
final List<TranslationLink>[] projectsLinks;
if (commandLine.hasOption("resources")) {
final String[] projectResources = commandLine.getOptionValues("resources");
projectsLinks = new List[projectResources.length];
for (int j = 0; j < projectResources.length; j++) {
final String resources = projectResources[j];
projectsLinks[j] = new ArrayList<>();
for (String resource : resources.split(",")) {
final int i = resource.indexOf("-");
if (i >= 0) {
projectsLinks[j].add(new TranslationLink(resource.substring(0, i), prefix + resource.substring(i + 1, resource.length())));
} else {
projectsLinks[j].add(new TranslationLink(resource, prefix + resource));
}
}
}
} else {
projectsLinks = null;
}
final List<String> languageLocales = new ArrayList<>();
languageLocales.addAll(Arrays.asList(commandLine.getOptionValue("languages").split(",")));
languageLocales.add("");
final File outDir = new File(commandLine.getOptionValue("output"));
Utils.delete(outDir);
final File outResDir = new File(outDir, "res");
outResDir.mkdirs();
if (projects != null && projects.length != 0) {
if (projectsLinks == null || projectsLinks.length != projects.length) {
throw new IllegalArgumentException("Projects=" + projects.length + ", resources=" + (projectsLinks == null ? 0 : projectsLinks.length));
}
for (int i = 0; i < projects.length; i++) {
final File project = projects[i];
final List<TranslationLink> projectLinks = projectsLinks[i];
translate(outResDir, languageLocales, "other" + (i == 0 ? "" : i), new TranslationDef(project, projectLinks));
}
}
}
private static String makePrefix(String prefix) {
if (prefix == null || prefix.length() == 0) {
return "";
}
return prefix + "_";
}
private static void translate(File outDir, List<String> languageLocales, String outPostfix, TranslationDef... translationDefs) throws Exception {
for (String languageLocale : languageLocales) {
Resources translations = new Resources();
for (TranslationDef def : translationDefs) {
translate(readResources(def.project, languageLocale), translations, def.links);
}
Utils.saveTranslations(translations, languageLocale, outDir, "strings_imported_" + outPostfix + ".xml");
}
}
private static Resources readResources(File from, String languageLocale) throws Exception {
File inFile = makeStringsFile(from, languageLocale);
if (!inFile.exists()) {
final int i = languageLocale.indexOf("-r");
if (i >= 0) {
inFile = makeStringsFile(from, languageLocale.substring(0, i));
}
}
final Resources resources = Utils.persister.read(Resources.class, inFile);
if (resources != null) {
resources.comment = "Copied from " + from;
}
return resources;
}
private static File makeStringsFile(File from, String languageLocale) {
return new File(new File(from, Utils.valuesFolderName(languageLocale)), "strings.xml");
}
private static File makeInputDirectory(String dirName) {
final File dir = new File(dirName);
if (!dir.exists() || !dir.isDirectory()) {
throw new IllegalArgumentException(dir + " doesn't exist or not a directory");
}
return new File(dir, "res");
}
private static void translate(Resources from, Resources to, List<TranslationLink> links) {
to.comment = from.comment;
for (TranslationLink translationLink : links) {
String translation = translate(from, translationLink);
if (!TextUtils.isBlank(translation)) {
to.strings.add(new ResourceString(translationLink.outName, translation));
}
}
}
private static String translate(Resources resources, TranslationLink translationLink) {
for (ResourceString string : resources.strings) {
if (string.name.equals(translationLink.inName)) {
if (TextUtils.isBlank(string.value)) {
return null;
}
if (string.value.length() >= 2 && string.value.startsWith("\"") && string.value
.endsWith("\"")) {
return string.value.substring(1, string.value.length() - 1);
}
return string.value;
}
}
return null;
}
private static class TranslationDef {
public final File project;
public final List<TranslationLink> links;
private TranslationDef(File project, List<TranslationLink> links) {
this.project = project;
this.links = links;
}
}
private static class TranslationLink {
public final String inName;
public final String outName;
private TranslationLink(String inName, String outName) {
this.inName = inName;
this.outName = outName;
}
}
}