| 1 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 ; 25 import org.xml.sax.Attributes ; 26 import org.xml.sax.ext.LexicalHandler ; 27 import org.xml.sax.helpers.DefaultHandler ; 28 import java.util.Vector ; 29 import java.util.StringTokenizer ; 30 import org.xml.sax.InputSource ; 31 import javax.servlet.*; 32 33 import org.apache.log4j.Logger; 34 import org.apache.log4j.PropertyConfigurator; 35 36 40 public class Translate extends DefaultHandler implements LexicalHandler { 41 public static final String VERSION = "V1.O00.1"; 42 protected static CPStandAlone pool; 43 static XMLReader parser; 44 static TranslateData[] toLanguage; 45 static String fromLanguage; 46 static String actualLanguage; 47 static String fileTermination; 48 static OutputStreamWriter out; 49 static PrintWriter printWriterTxt; 50 static boolean error; 51 static boolean isHtml = false; 52 static StringBuffer strBuffer; 53 static String actualTag; 54 static String actualFile; 55 static String actualPrefix; 56 static StringBuffer translationText; 57 static int count = 0; 58 public static final String [] tokens = {"-", ":"}; 59 60 static Logger log4j = Logger.getLogger(Translate.class); 61 62 public Translate (String xmlPoolFile, String _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 argv[]) throws Exception { 74 PropertyConfigurator.configure("log4j.lcf"); 75 String dirIni; 76 String dirFin; 77 boolean boolFilter; 78 DirFilter dirFilter = null; 79 String 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 public static void listDir(File file, boolean boolFilter, DirFilter dirFilter, File fileFin, String 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 String prevRelativePath = new String (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 144 145 private static void parseFile(File fileParsing, File fileFin, String relativePath) { 146 String 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 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 169 java.util.Date newFileModified = new java.util.Date (fileHTML.lastModified()); 170 java.util.Date oldFileModified = new java.util.Date (fileParsing.lastModified()); 171 if (newFileModified.compareTo(oldFileModified) > 0) return; 173 } 176 count++; 177 FileOutputStream resultsFile = new FileOutputStream(fileHTML); 178 out = new OutputStreamWriter(resultsFile, "UTF-8"); 179 180 strBuffer = new StringBuffer (); 181 log4j.info("F " + fileParsing); 182 java.util.Date date = new java.util.Date (); if (log4j.isDebugEnabled()) log4j.debug("Hour: " + date.getTime()); 184 error = false; 185 try { 186 parser.parse(new InputSource (new FileReader(fileParsing))); 188 } catch (IOException e) { 189 log4j.error("file: " + actualFile); 190 e.printStackTrace(); 191 } catch (Exception 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 } 201 } catch(IOException e) { 202 e.printStackTrace(); 203 log4j.error("Problem at close of the file"); 204 } 205 } 206 207 public String parseAttributes(Attributes amap) { 208 StringBuffer data = new StringBuffer (); 209 String type = ""; 210 String value = ""; 211 boolean hasvalue = false; 212 for (int i = 0; i < amap.getLength(); i++) { 213 String 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 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 prefix, String uri) { 250 actualPrefix = " xmlns:" + prefix + "=\"" + uri + "\""; 251 } 252 253 public boolean isParseable(String 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 uri, String name, String qName, Attributes amap) { 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 name) {} 281 public void startDTD(String name, String publicId, String systemId) {} 282 public void startEntity(String 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 uri, String name, String qName) { 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) { String chars = new String (ch, start, length); 310 if (log4j.isDebugEnabled()) log4j.debug("Configuration(characters) is called: " + chars); 311 if (translationText==null) translationText = new StringBuffer (); 312 translationText.append(chars); 313 } 314 315 public String translate(String ini) { 316 return translate(ini, false); 317 } 318 319 public String translate(String 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 text = new StringBuffer (); 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 <String > translated = new Vector <String >(0); 340 boolean aux=true; 341 translated.addElement("Y"); 342 String 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 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 replace(String strInicial, String strReplaceWhat, String strReplaceWith) { 370 int index = 0; 371 int pos; 372 StringBuffer strFinal = new StringBuffer (""); 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 delSp(String strIni){ 386 boolean sp = false; 387 String 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 tokenize(String ini, int indice, Vector <String > isTranslated) { 396 StringBuffer fin = new StringBuffer (); 397 try { 398 boolean first = true; 399 String 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].adTextinterfacesId); 405 } 406 if (translated!=null && translated.length()>0) { 407 fin.append(translated); 408 return fin.toString(); 409 } 410 StringTokenizer st = new StringTokenizer (ini, tokens[indice], false); 411 while (st.hasMoreTokens()) { 412 if (first) { 413 first = false; 414 } else { 415 fin.append(tokens[indice]); 416 } 417 String 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].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 e) { 434 e.printStackTrace(); 435 } 436 return fin.toString(); 437 } 438 439 public void destroy() { 440 pool.destroy(); 441 } 442 } 443 | Popular Tags |