KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openbravo > translate > Translate


1 /*
2  *************************************************************************
3  * The contents of this file are subject to the Openbravo Public License
4  * Version 1.0 (the "License"), being the Mozilla Public License
5  * Version 1.1 with a permitted attribution clause; you may not use this
6  * file except in compliance with the License. You may obtain a copy of
7  * the License at http://www.openbravo.com/legal/license.html
8  * Software distributed under the License is distributed on an "AS IS"
9  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
10  * License for the specific language governing rights and limitations
11  * under the License.
12  * The Original Code is Openbravo ERP.
13  * The Initial Developer of the Original Code is Openbravo SL
14  * All portions are Copyright (C) 2001-2006 Openbravo SL
15  * All Rights Reserved.
16  * Contributor(s): ______________________________________.
17  ************************************************************************
18 */

19 package org.openbravo.translate;
20
21 import org.openbravo.database.CPStandAlone;
22 import java.io.*;
23 import org.apache.xerces.parsers.*;
24 import org.xml.sax.XMLReader JavaDoc;
25 import org.xml.sax.Attributes JavaDoc;
26 import org.xml.sax.ext.LexicalHandler JavaDoc;
27 import org.xml.sax.helpers.DefaultHandler JavaDoc;
28 import java.util.Vector JavaDoc;
29 import java.util.StringTokenizer JavaDoc;
30 import org.xml.sax.InputSource JavaDoc;
31 import javax.servlet.*;
32
33 import org.apache.log4j.Logger;
34 import org.apache.log4j.PropertyConfigurator;
35
36 /**
37  * Translate the HTML file of the folder especified
38  *
39  **/

40 public class Translate extends DefaultHandler JavaDoc implements LexicalHandler JavaDoc {
41   public static final String JavaDoc VERSION = "V1.O00.1";
42   protected static CPStandAlone pool;
43   static XMLReader JavaDoc parser;
44   static TranslateData[] toLanguage;
45   static String JavaDoc fromLanguage;
46   static String JavaDoc actualLanguage;
47   static String JavaDoc fileTermination;
48   static OutputStreamWriter out;
49   static PrintWriter printWriterTxt;
50   static boolean error;
51   static boolean isHtml = false;
52   static StringBuffer JavaDoc strBuffer;
53   static String JavaDoc actualTag;
54   static String JavaDoc actualFile;
55   static String JavaDoc actualPrefix;
56   static StringBuffer JavaDoc translationText;
57   static int count = 0;
58   public static final String JavaDoc[] tokens = {"-", ":"};
59
60   static Logger log4j = Logger.getLogger(Translate.class);
61
62   public Translate (String JavaDoc xmlPoolFile, String JavaDoc _fileTermination) throws ServletException {
63     pool = new CPStandAlone (xmlPoolFile);
64     this.fileTermination = _fileTermination;
65     isHtml=this.fileTermination.toLowerCase().endsWith("html");
66     if (isHtml) parser = new org.cyberneko.html.parsers.SAXParser();
67     else parser = new SAXParser();
68     parser.setContentHandler(this);
69     this.fromLanguage = TranslateData.baseLanguage(pool);
70     this.toLanguage = TranslateData.systemLanguage(pool);
71   }
72
73   public static void main(String JavaDoc argv[]) throws Exception JavaDoc {
74     PropertyConfigurator.configure("log4j.lcf");
75     String JavaDoc dirIni;
76     String JavaDoc dirFin;
77     boolean boolFilter;
78     DirFilter dirFilter = null;
79     String JavaDoc relativePath = "";
80
81     if (argv.length < 4) {
82       log4j.error("Usage: java Translate XmlPool.xml fileTermination sourceDir destinyDir relativePath");
83       return;
84     }
85
86     Translate translate = new Translate(argv[0], argv[1]);
87
88     dirIni = argv[2];
89     dirFin = argv[3];
90     if (argv.length > 4) relativePath = argv[4];
91     boolFilter = true;
92     dirFilter = new DirFilter(translate.fileTermination);
93     log4j.info("directory source: " + dirIni);
94     log4j.info("directory destiny: " + dirFin);
95     log4j.info("file termination: " + translate.fileTermination);
96
97     File path = new File(dirIni, relativePath);
98     if (!path.exists()) {
99       System.out.println("Can´t find directory: " + dirIni);
100       translate.destroy();
101       return;
102     }
103     File fileFin = new File(dirFin);
104     if (!fileFin.exists()) {
105       System.out.println("Can´t find directory: " + dirFin);
106       translate.destroy();
107       return;
108     }
109     translate.listDir(path, boolFilter, dirFilter, fileFin, relativePath);
110     System.out.println("Translated files for " + translate.fileTermination + ": " + translate.count);
111     translate.destroy();
112   }
113
114   // lista los archivos y directorios correspondientes a un File
115
public static void listDir(File file, boolean boolFilter, DirFilter dirFilter, File fileFin, String JavaDoc relativePath) {
116     File[] list;
117     if(boolFilter) list = file.listFiles(dirFilter);
118     else list = file.listFiles();
119     for(int i = 0; i < list.length; i++) {
120       File fileItem = list[i];
121       if (fileItem.isDirectory()) {
122         // si es subdirectorio se lista recursivamente
123
String JavaDoc prevRelativePath = new String JavaDoc(relativePath);
124         relativePath += "/" + fileItem.getName();
125         listDir(fileItem, boolFilter, dirFilter, fileFin, relativePath);
126         relativePath = prevRelativePath;
127       } else {
128         try {
129           if (log4j.isDebugEnabled()) log4j.debug(list[i] + " Parent: " + fileItem.getParent() + " getName() " + fileItem.getName() + " canonical: " + fileItem.getCanonicalPath());
130           for (int h=0;h<toLanguage.length;h++) {
131             actualLanguage = toLanguage[h].name;
132             parseFile(list[i], fileFin, relativePath);
133           }
134         } catch (IOException e) {
135           log4j.error("IOException: " + e);
136         }
137       }
138     }
139   }
140
141   /* cambiar dirIni.toString() por file
142      buscar la terminacion solo en el final
143    */

144
145   private static void parseFile(File fileParsing, File fileFin, String JavaDoc relativePath) {
146     String JavaDoc strFileName = fileParsing.getName();
147     if (log4j.isDebugEnabled()) log4j.debug("Parsing of " + strFileName);
148     int pos = strFileName.indexOf(fileTermination);
149     if (pos == -1) {
150       log4j.error("File " + strFileName + " don't have termination " + fileTermination);
151       return;
152     }
153     String JavaDoc strFileWithoutTermination = strFileName.substring(0, pos);
154     if (log4j.isDebugEnabled()) log4j.debug("File without termination: " + strFileWithoutTermination);
155     actualFile = relativePath + "/" + strFileName;
156     try {
157       if (log4j.isDebugEnabled()) log4j.debug("Relative path: " + actualLanguage + "/" + relativePath);
158       File dirHTML = new File(fileFin, actualLanguage + "/" + relativePath);
159       if (log4j.isDebugEnabled()) log4j.debug(" dirHTML: " + dirHTML);
160       dirHTML.mkdirs();
161       File fileHTML = new File(dirHTML, strFileWithoutTermination + fileTermination);
162       if (log4j.isDebugEnabled()) log4j.debug(" fileHTML: " + fileHTML);
163       if (log4j.isDebugEnabled()) log4j.debug(" time file parsed: " + fileParsing.lastModified() + " time file HTML new: " + fileHTML.lastModified());
164       if (fileHTML.exists()) {
165         /*java.util.Date lastModified = new java.util.Date(fileHTML.lastModified());
166         java.util.Calendar modificationReference = java.util.Calendar.getInstance();
167         modificationReference.add(java.util.Calendar.MINUTE, -10);
168         if (lastModified.compareTo(modificationReference.getTime()) < 0) return;*/

169         java.util.Date JavaDoc newFileModified = new java.util.Date JavaDoc(fileHTML.lastModified());
170         java.util.Date JavaDoc oldFileModified = new java.util.Date JavaDoc(fileParsing.lastModified());
171         //if (count == 0) System.out.println("******************** " + newFileModified.compareTo(oldFileModified) + " - " + newFileModified + " - " + oldFileModified);
172
if (newFileModified.compareTo(oldFileModified) > 0) return;
173         //if (!fileTermination.equalsIgnoreCase("jrxml") && newFileModified.compareTo(oldFileModified) > 0) return;
174
//if (fileHTML.lastModified()>= fileParsing.lastModified()) return;
175
}
176       count++;
177       FileOutputStream resultsFile = new FileOutputStream(fileHTML);
178       out = new OutputStreamWriter(resultsFile, "UTF-8");
179     
180       strBuffer = new StringBuffer JavaDoc();
181       log4j.info("F " + fileParsing);
182       java.util.Date JavaDoc date = new java.util.Date JavaDoc(); // there is date in java.sql.*
183
if (log4j.isDebugEnabled()) log4j.debug("Hour: " + date.getTime());
184       error = false;
185       try {
186 // parser.parse(fileParsing.getAbsolutePath());
187
parser.parse(new InputSource JavaDoc(new FileReader(fileParsing)));
188       } catch (IOException e) {
189         log4j.error("file: " + actualFile);
190         e.printStackTrace();
191       } catch (Exception JavaDoc e) {
192         log4j.error("file: " + actualFile);
193         e.printStackTrace();
194       }
195       out.write(strBuffer.toString());
196       out.flush();
197       resultsFile.close();
198       if (error) {
199 // fileHTML.delete();
200
}
201     } catch(IOException e) {
202        e.printStackTrace();
203        log4j.error("Problem at close of the file");
204     }
205   }
206
207   public String JavaDoc parseAttributes(Attributes JavaDoc amap) {
208     StringBuffer JavaDoc data = new StringBuffer JavaDoc();
209     String JavaDoc type = "";
210     String JavaDoc value = "";
211     boolean hasvalue = false;
212     for (int i = 0; i < amap.getLength(); i++) {
213       String JavaDoc strAux = amap.getValue(i);
214       if (amap.getQName(i).equalsIgnoreCase("type")) {
215         type = strAux;
216       } else if (amap.getQName(i).equalsIgnoreCase("value")) {
217         hasvalue = true;
218         value = strAux;
219       } else if (amap.getQName(i).equalsIgnoreCase("onMouseOver")) {
220         if (strAux.toLowerCase().startsWith("window.status='")) {
221           int j = strAux.lastIndexOf("';");
222           int aux = j;
223           while ((j!=-1) && (aux=strAux.lastIndexOf("';", j-1))!=-1) {
224             j=aux;
225           }
226           String JavaDoc strToken = translate(strAux.substring(15, j));
227           strAux = strAux.substring(0, 15) + strToken + strAux.substring(j);
228         }
229       } else if (amap.getQName(i).equalsIgnoreCase("alt")) {
230         strAux = translate(strAux);
231       } else if (amap.getQName(i).equalsIgnoreCase("title")) {
232         strAux = translate(strAux);
233       }
234       if (!amap.getQName(i).equalsIgnoreCase("value")) data.append(" ").append(amap.getQName(i)).append("=\"").append(strAux).append("\"");
235     }
236     if (value!=null && !value.equals("")) {
237       if (type.equalsIgnoreCase("button")) value = translate(value);
238       data.append(" value=\"").append(value).append("\"");
239     } else if (hasvalue) {
240       data.append(" value=\"").append(value).append("\"");
241     }
242     return data.toString();
243   }
244
245   public void startDocument() {
246     if (!isHtml) strBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
247   }
248
249   public void startPrefixMapping(String JavaDoc prefix, String JavaDoc uri) {
250     actualPrefix = " xmlns:" + prefix + "=\"" + uri + "\"";
251   }
252
253   public boolean isParseable(String JavaDoc tagname) {
254     if (tagname.equalsIgnoreCase("script")) return false;
255     else if (fileTermination.equalsIgnoreCase("jrxml")) {
256       if (!tagname.equalsIgnoreCase("text") && !tagname.equalsIgnoreCase("textFieldExpression")) return false;
257     }
258     return true;
259   }
260
261   public void startElement(String JavaDoc uri, String JavaDoc name, String JavaDoc qName, Attributes JavaDoc amap) {//(String name, AttributeList amap) throws SAXException {
262
if (log4j.isDebugEnabled()) log4j.debug("Configuration: startElement is called: element name=" + qName);
263     if (actualTag!=null && isParseable(actualTag) && translationText != null) {
264       strBuffer.append(translate(translationText.toString()));
265     } else if (translationText != null) strBuffer.append(translationText.toString());
266     translationText = null;
267     if (strBuffer.toString().endsWith(">")) strBuffer.append("\n");
268     strBuffer.append("<" + qName);
269     strBuffer.append(parseAttributes(amap));
270     if (actualPrefix!=null && !actualPrefix.equals("")) {
271       strBuffer.append(actualPrefix);
272       actualPrefix = "";
273     }
274     strBuffer.append(">");
275     actualTag=name.trim().toUpperCase();
276   }
277
278   public void comment(char[] ch, int start, int length) {}
279   public void endDTD() {}
280   public void endEntity(String JavaDoc name) {}
281   public void startDTD(String JavaDoc name, String JavaDoc publicId, String JavaDoc systemId) {}
282   public void startEntity(String JavaDoc name) {}
283
284   public void startCDATA() {
285     strBuffer.append("<![CDATA[");
286   }
287   public void endCDATA() {
288     strBuffer.append("]]>");
289   }
290
291   public void endElement(String JavaDoc uri, String JavaDoc name, String JavaDoc qName) {//(String name) throws SAXException {
292
if (log4j.isDebugEnabled()) log4j.debug("Configuration: endElement is called: " + qName);
293     if (isParseable(actualTag) && translationText != null) {
294       if (fileTermination.equalsIgnoreCase("jrxml")) startCDATA();
295       strBuffer.append(translate(translationText.toString()));
296       if (log4j.isDebugEnabled()) log4j.debug("endElement - TranslationText: " + translationText.toString());
297       if (fileTermination.equalsIgnoreCase("jrxml")) endCDATA();
298     } else if (translationText != null) {
299       if (fileTermination.equalsIgnoreCase("jrxml")) startCDATA();
300       strBuffer.append(translationText.toString());
301       if (fileTermination.equalsIgnoreCase("jrxml")) endCDATA();
302     }
303     translationText = null;
304     strBuffer.append("</" + qName + ">");
305     actualTag="";
306   }
307
308   public void characters(char[] ch, int start, int length) {//throws SAXException {
309
String JavaDoc chars = new String JavaDoc(ch, start, length);
310     if (log4j.isDebugEnabled()) log4j.debug("Configuration(characters) is called: " + chars);
311     if (translationText==null) translationText = new StringBuffer JavaDoc();
312     translationText.append(chars);
313   }
314
315   public String JavaDoc translate(String JavaDoc ini) {
316     return translate(ini, false);
317   }
318
319   public String JavaDoc translate(String JavaDoc ini, boolean isPartial) {
320     ini = replace(replace(ini.trim(), "\r", ""), "\n", " ");
321     ini = ini.trim();
322     ini = delSp(ini);
323     if (!isPartial && actualTag.equalsIgnoreCase("textFieldExpression")) {
324       StringBuffer JavaDoc text = new StringBuffer JavaDoc();
325       int pos = ini.indexOf("\"");
326       while (pos!=-1) {
327         text.append(ini.substring(0, pos+1));
328         ini = ini.substring(pos+1);
329         pos = ini.indexOf("\"");
330         if (pos!=-1) {
331           text.append(translate(ini.substring(0, pos), true)).append("\"");
332           ini = ini.substring(pos+1);
333         } else break;
334         pos = ini.indexOf("\"");
335       }
336       text.append(ini);
337       return text.toString();
338     }
339     Vector JavaDoc<String JavaDoc> translated = new Vector JavaDoc<String JavaDoc>(0);
340     boolean aux=true;
341     translated.addElement("Y");
342     String JavaDoc resultado = ini;
343     if (!ini.equals("") && !ini.toLowerCase().startsWith("xx") && !isNumeric(ini)) {
344       resultado = tokenize(ini, 0, translated);
345       try {
346         aux = translated.elementAt(0).equals("Y");
347         if (!aux && TranslateData.existsExpresion(pool, ini, actualFile)==0) {
348           TranslateData.insert(pool, ini, actualFile);
349           log4j.warn("Couldn't translate: " + ini + ".Result translated: " + resultado + ".Actual file: " + actualFile);
350         }
351       } catch (ServletException e) {
352         e.printStackTrace();
353       }
354     }
355     return resultado;
356   }
357
358   public boolean isNumeric(String JavaDoc ini) {
359     boolean isNumericData = true;
360     for (int i=0; i< ini.length(); i++) {
361       if (Character.isLetter(ini.charAt(i))) {
362         isNumericData = false;
363         break;
364       }
365     }
366     return isNumericData;
367   }
368
369   public String JavaDoc replace(String JavaDoc strInicial, String JavaDoc strReplaceWhat, String JavaDoc strReplaceWith) {
370     int index = 0;
371     int pos;
372     StringBuffer JavaDoc strFinal = new StringBuffer JavaDoc("");
373     do {
374       pos = strInicial.indexOf(strReplaceWhat, index);
375       if (pos != - 1) {
376         strFinal.append(strInicial.substring(index, pos) + strReplaceWith);
377         index = pos + strReplaceWhat.length();
378       } else {
379         strFinal.append(strInicial.substring(index));
380       }
381     } while (index < strInicial.length() && pos != -1);
382     return strFinal.toString();
383   }
384
385   public String JavaDoc delSp(String JavaDoc strIni){
386     boolean sp = false;
387     String JavaDoc strFin = "";
388     for (int i=0; i<strIni.length() ; i++ ){
389       if (!sp || strIni.charAt(i)!=' ') strFin += strIni.charAt(i);
390       sp = (strIni.charAt(i)==' ');
391     }
392     return strFin;
393   }
394
395   public String JavaDoc tokenize(String JavaDoc ini, int indice, Vector JavaDoc<String JavaDoc> isTranslated) {
396     StringBuffer JavaDoc fin = new StringBuffer JavaDoc();
397     try {
398       boolean first = true;
399       String JavaDoc translated = null;
400       TranslateData[] dataTranslated = TranslateData.select(pool,ini.trim(), actualFile, actualLanguage);
401       if (dataTranslated!=null && dataTranslated.length>0) {
402         translated = dataTranslated[0].tr;
403         //TranslateData.update(pool, dataTranslated[0].baseDictionaryEntryId, actualLanguage);
404
TranslateData.update(pool, dataTranslated[0].adTextinterfacesId);
405       }
406       if (translated!=null && translated.length()>0) {
407         fin.append(translated);
408         return fin.toString();
409       }
410       StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(ini, tokens[indice], false);
411       while (st.hasMoreTokens()) {
412         if (first) {
413           first = false;
414         } else {
415           fin.append(tokens[indice]);
416         }
417         String JavaDoc token = st.nextToken();
418         token = token.trim();
419         if (log4j.isDebugEnabled()) log4j.debug("Token of " + ini + " : -" + token + "-");
420         translated = null;
421         dataTranslated = TranslateData.select(pool,token.trim(), actualFile, actualLanguage);
422         if (dataTranslated!=null && dataTranslated.length>0) {
423           translated = dataTranslated[0].tr;
424           //TranslateData.update(pool, dataTranslated[0].baseDictionaryEntryId, actualLanguage);
425
TranslateData.update(pool, dataTranslated[0].adTextinterfacesId);
426         }
427         if ((translated==null || translated.equals("")) && indice<(tokens.length-1)) translated=tokenize(token, indice+1, isTranslated);
428         if (translated==null || translated.equals("")) {
429           fin.append(token);
430           isTranslated.set(0, "N");
431         } else fin.append(translated);
432       }
433     } catch (Exception JavaDoc e) {
434       e.printStackTrace();
435     }
436     return fin.toString();
437   }
438
439   public void destroy() {
440     pool.destroy();
441   }
442 }
443
Popular Tags