
w3c.css.index.TranslationTableGenerator Maven / Gradle / Ivy
/**
* This class is used to generates the index pages
* of the CSS validator in all the availables languages
* it'll create the outputs validator.en.html, validator.fr.html, ...
* according to the template file validator.vm
*/
package org.w3c.css.index;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.Messages;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Set;
import java.util.Vector;
/**
* @author olivier Thereaux for W3C
*/
class AlphaComparator implements Comparator {
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
}
public class TranslationTableGenerator {
// the velocity context used to generate the index
// (NB: the same context is used for each index page, changing every thing
// inside)
public static VelocityContext vc = new VelocityContext();
private static String html_files_path = "../../../../";
private static boolean done = false;
private static String template_name = "translations.vm";
/**
* @param args
*/
public static void main(String[] args) {
TranslationTableGenerator.generateTable();
}
/**
* This method generates the index in every possible language we have the translation
*
* @see org.w3c.css.util.Messages
*/
public static synchronized void generateTable() {
String default_lang = "en";
String name, path;
StringBuilder table_head = new StringBuilder();
StringBuilder translations_table = new StringBuilder();
File out_file;
path = TranslationTableGenerator.class.getResource("").getPath();
try {
path = new URI(path).getPath();
Velocity.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
Velocity.addProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path + "../css/");
Velocity.setProperty(Velocity.RUNTIME_LOG,
"velocity-" + new SimpleDateFormat("yyyy-MM-dd_HHmm").format(new Date()) + ".log");
Velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.AvalonLogChute");
Velocity.init();
Template tpl = Velocity.getTemplate(template_name, "UTF-8");
out_file = new File(path + html_files_path + "translations.html");
ApplContext ac_default = new ApplContext(default_lang);
// Getting the differents languages informations (for the lang choice)
ArrayList> languages;
languages = new ArrayList>(Messages.languages_name.size());
HashMap translations = new HashMap();
HashMap translation_completeness = new HashMap();
table_head.append("Property ");
for (int i = 0; i < Messages.languages_name.size(); ++i) {
name = String.valueOf(Messages.languages_name.get(i));
HashMap l = new HashMap();
l.put("name", name);
l.put("real", (Messages.languages.get(name)).getProperty("language_name"));
languages.add(i, l);
ApplContext ac_translated = new ApplContext(name);
if (!name.equals(default_lang)) {
Locale locale;
String engName;
int hy = name.indexOf("-");
if (hy > 0) {
String m = name.substring(0, hy);
String s = name.substring(hy + 1);
hy = s.indexOf("-");
if (hy > 0) {
String v = s.substring(hy + 1);
s = s.substring(0, hy);
locale = new Locale(m, s, v);
} else {
locale = new Locale(m, s, "");
}
} else {
locale = new Locale(name);
}
engName = locale.getDisplayName(Locale.US);
table_head.append("");
table_head.append(l.get("real")).append(" ");
l.put("engname", engName);
}
translations.put(name, ac_translated);
translation_completeness.put(name, 0);
}
table_head.append(" ");
Vector sorted_properties_keys;
Set properties_keyset = ac_default.getMsg().properties.keySet();
sorted_properties_keys = new Vector(properties_keyset);
Collections.sort(sorted_properties_keys, new AlphaComparator());
Iterator properties_iterator = sorted_properties_keys.iterator();
translations_table.append("");
int num_properties = 0;
while (properties_iterator.hasNext()) {
++num_properties;
String property_name = String.valueOf(properties_iterator.next());
translations_table.append("").append(property_name);
translations_table.append("").append(StringEscapeUtils.escapeHtml4(ac_default.getMsg().getString(property_name)));
translations_table.append("
");
for (int i = 0; i < Messages.languages_name.size(); ++i) {
HashMap language = languages.get(i);
ApplContext translation = translations.get(language.get("name"));
String property_translated = translation.getMsg().getStringStrict(property_name);
if (language.get("name").equals(default_lang)) {
vc.put(property_name, property_translated);
} else {
URI mail_translation = new URI("mailto", "[email protected]?Subject=[" + property_name + "] CSS Validator Translation&body=Property:\n " + property_name + "\n\nText in English:\n " + ac_default.getMsg().getString(property_name) + "\n\nLanguage:\n " + language.get("name") + "\n\nTranslation:\n\n\n-- Help translate the CSS Validator:\nhttps://jigsaw.w3.org/css-validator/translations.html", "");
if (property_translated == null) {
translations_table.append("✘ \n");
} else if (property_translated.matches(".*translation unavailable.*")) {
translations_table.append("✘ \n");
} else {
translations_table.append("✔ \n");
int completed = Integer.parseInt(translation_completeness.get(language.get("name")).toString());
completed++;
translation_completeness.put(language.get("name"), completed);
//System.out.println(language.get("name")+": "+completed);
}
}
}
translations_table.append(" ");
if (num_properties % 12 == 0) {
translations_table.append("").append(table_head);
}
}
translations_table.append("");
for (int i = 0; i < Messages.languages_name.size(); i++) {
name = String.valueOf(Messages.languages_name.get(i));
HashMap l = languages.get(i);
int completeness_percent = 100 * Integer.parseInt(translation_completeness.get(l.get("name")).toString());
completeness_percent /= ac_default.getMsg().properties.size();
l.put("completeness", Integer.toString(completeness_percent));
// FIXME not needed // languages[i] = l;
}
vc.put("languages", languages);
vc.put("num_languages", Messages.languages_name.size());
vc.put("total_properties", ac_default.getMsg().properties.size());
vc.put("translations_table", translations_table.toString());
vc.put("lang", "en");
OutputStreamWriter aFileWriter = new OutputStreamWriter(new FileOutputStream(out_file), "UTF-8");
tpl.merge(vc, aFileWriter);
aFileWriter.close();
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ResourceNotFoundException e) {
e.printStackTrace();
} catch (ParseErrorException e) {
e.printStackTrace();
} catch (MethodInvocationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
done = true;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy