]> WPIA git - gigi.git/blob - util/org/cacert/gigi/util/FetchLocales.java
upd: get translations from new translation server
[gigi.git] / util / org / cacert / gigi / util / FetchLocales.java
1 package org.cacert.gigi.util;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStreamReader;
8 import java.io.UnsupportedEncodingException;
9 import java.net.URL;
10 import java.net.URLConnection;
11 import java.util.Scanner;
12
13 import javax.xml.parsers.DocumentBuilder;
14 import javax.xml.parsers.DocumentBuilderFactory;
15 import javax.xml.parsers.ParserConfigurationException;
16 import javax.xml.transform.OutputKeys;
17 import javax.xml.transform.Transformer;
18 import javax.xml.transform.TransformerConfigurationException;
19 import javax.xml.transform.TransformerException;
20 import javax.xml.transform.TransformerFactory;
21 import javax.xml.transform.TransformerFactoryConfigurationError;
22 import javax.xml.transform.dom.DOMSource;
23 import javax.xml.transform.stream.StreamResult;
24
25 import org.w3c.dom.Document;
26 import org.w3c.dom.Element;
27 import org.w3c.dom.Node;
28
29 public class FetchLocales {
30
31     public static final String DOWNLOAD_SERVER = "pootle.cacert1.dogcraft.de";
32
33     public static String PO_URL_TEMPLATE = "https://" + DOWNLOAD_SERVER + "/%/gigi/messages.po";
34
35     public static final String[] AUTO_LANGS = new String[] {
36         "de"
37     };
38
39     public static void main(String[] args) throws IOException, ParserConfigurationException, TransformerException {
40         if (args.length != 0) {
41             PO_URL_TEMPLATE = args[0];
42         }
43         System.out.println("downloading locales ...");
44         File locale = new File("locale");
45         if ( !locale.isDirectory() && !locale.mkdir()) {
46             throw new IOException("Could not create locales directory.");
47         }
48
49         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
50         DocumentBuilder db = dbf.newDocumentBuilder();
51         for (String lang : AUTO_LANGS) {
52             Document doc = db.newDocument();
53             doc.appendChild(doc.createElement("translations"));
54
55             int count = addTranslationsFromPo(doc, new URL(PO_URL_TEMPLATE.replace("%", lang)));
56
57             System.out.println("Strings for language " + lang + ": " + count);
58
59             writeTranslationToFile(doc, new File(locale, lang + ".xml"));
60         }
61         Document doc = db.newDocument();
62         doc.appendChild(doc.createElement("translations"));
63         System.out.println("Creating empty en.xml");
64         writeTranslationToFile(doc, new File(locale, "en.xml"));
65         System.out.println("Done.");
66     }
67
68     private static void writeTranslationToFile(Document doc, File file) throws TransformerFactoryConfigurationError, TransformerConfigurationException, FileNotFoundException, TransformerException, IOException {
69         TransformerFactory tFactory = TransformerFactory.newInstance();
70         Transformer transformer = tFactory.newTransformer();
71
72         DOMSource source = new DOMSource(doc);
73         FileOutputStream fos = new FileOutputStream(file);
74         StreamResult result = new StreamResult(fos);
75         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
76         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
77         transformer.transform(source, result);
78         fos.close();
79     }
80
81     private static int addTranslationsFromPo(Document doc, URL fetch) throws IOException, UnsupportedEncodingException {
82         URLConnection uc = fetch.openConnection();
83         Scanner sc = new Scanner(new InputStreamReader(uc.getInputStream(), "UTF-8"));
84         String s = readLine(sc);
85         StringBuffer contents = new StringBuffer();
86         String id = "";
87         int count = 0;
88         while (s != null) {
89             if (s.startsWith("msgid")) {
90                 count++;
91                 contents.delete(0, contents.length());
92                 s = readString(s, sc, contents);
93                 id = contents.toString();
94                 continue;
95             } else if (s.startsWith("msgstr")) {
96                 contents.delete(0, contents.length());
97                 // System.out.println("msgstr");
98                 s = readString(s, sc, contents);
99                 String msg = contents.toString().replace("\\\"", "\"").replace("\\n", "\n");
100                 insertTranslation(doc, id, msg);
101             } else if (s.startsWith("#")) {
102                 // System.out.println(s);
103             } else if (s.equals("") || s.equals("\r")) {
104
105             } else {
106                 System.out.println("unknown line: " + s);
107             }
108             s = readLine(sc);
109         }
110         return count;
111     }
112
113     private static String readLine(Scanner sc) {
114         String line = sc.findWithinHorizon("[^\n]*\n", 0);
115         if (line == null) {
116             return null;
117         }
118         return line.substring(0, line.length() - 1);
119     }
120
121     private static void insertTranslation(Document doc, String id, String msg) {
122         Node idN = doc.createTextNode(id);
123         Node textN = doc.createTextNode(msg);
124         Element tr = doc.createElement("translation");
125         Element e = doc.createElement("id");
126         e.appendChild(idN);
127         tr.appendChild(e);
128         e = doc.createElement("msg");
129         e.appendChild(textN);
130         tr.appendChild(e);
131         doc.getDocumentElement().appendChild(tr);
132     }
133
134     private static String readString(String head, Scanner sc, StringBuffer contents) throws IOException {
135         head = head.split(" ", 2)[1];
136         contents.append(head.substring(1, head.length() - 1));
137         String s;
138         while ((s = readLine(sc)) != null) {
139             if ( !s.startsWith("\"")) {
140                 break;
141             }
142             contents.append(s.substring(1, s.length() - 1));
143         }
144         return s;
145     }
146
147 }