📄 translation.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Business Solution
* The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
* Portions created by Jorg Janke are Copyright (C) 1999-2002 Jorg Janke, parts
* created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.install;
import java.io.*;
import java.sql.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.compiere.*;
import org.compiere.util.*;
/**
* Translation Table Import + Export
*
* @author Jorg Janke
* @version $Id: Translation.java,v 1.5 2003/04/15 05:03:37 jjanke Exp $
*/
public class Translation
{
/** XML Element Tag */
public static final String XML_TAG = "compiereTrl";
/** XML Attribute Table */
public static final String XML_ATTRIBUTE_TABLE = "table";
/** XML Attribute Language */
public static final String XML_ATTRIBUTE_LANGUAGE = "language";
/** XML Row Tag */
public static final String XML_ROW_TAG = "row";
/** XML Row Attribute ID */
public static final String XML_ROW_ATTRIBUTE_ID = "id";
/** XML Row Attribute Translated */
public static final String XML_ROW_ATTRIBUTE_TRANSLATED = "trl";
/** XML Value Tag */
public static final String XML_VALUE_TAG = "value";
/** XML Value Column */
public static final String XML_VALUE_ATTRIBUTE_COLUMN = "column";
/** XML Value Original */
public static final String XML_VALUE_ATTRIBUTE_ORIGINAL = "original";
/** Table is centrally maintained */
private boolean m_IsCentrallyMaintained = false;
/**
* Import Translation
* @param directory file directory
* @param AD_Language language
* @param Trl_Table table
* @return status message
*/
public String importTrl (String directory, String AD_Language, String Trl_Table)
{
String fileName = directory + File.separator + Trl_Table + "_" + AD_Language + ".xml";
Log.trace(Log.l3_Util, "Translation.importTrl", fileName);
File in = new File (fileName);
if (!in.exists())
{
String msg = "File does not exist: " + fileName;
Log.error("Translation.importTrl - " + msg);
return msg;
}
try
{
TranslationHandler handler = new TranslationHandler();
SAXParserFactory factory = SAXParserFactory.newInstance();
// factory.setValidating(true);
SAXParser parser = factory.newSAXParser();
parser.parse(in, handler);
Log.trace(Log.l3_Util, "Translation.importTrl", "Updated=" + handler.getUpdateCount());
return Msg.getMsg(Env.getCtx(), "Updated") + "=" + handler.getUpdateCount();
}
catch (Exception e)
{
Log.error("Translation.importTrl", e);
return e.toString();
}
} // importTrl
/*************************************************************************/
/**
* Import Translation
* @param directory file directory
* @param AD_Language language
* @param Trl_Table translation table _Trl
* @return status message
*/
public String exportTrl (String directory, String AD_Language, String Trl_Table)
{
String fileName = directory + File.separator + Trl_Table + "_" + AD_Language + ".xml";
Log.trace(Log.l3_Util, "Translation.exportTrl", fileName);
File out = new File(fileName);
boolean isBaseLanguage = Language.isBaseLanguage(AD_Language);
String tableName = Trl_Table;
int pos = tableName.indexOf("_Trl");
String Base_Table = Trl_Table.substring(0, pos);
if (isBaseLanguage)
tableName = Base_Table;
String keyColumn = Base_Table + "_ID";
String[] trlColumns = getTrlColumns (Base_Table);
//
StringBuffer sql = null;
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// System.out.println(factory.getClass().getName());
DocumentBuilder builder = factory.newDocumentBuilder();
// <!DOCTYPE compiereTrl SYSTEM "http://www.compiere.org/dtd/compiereTrl.dtd">
Document document = builder.newDocument();
document.appendChild(document.createComment(Compiere.getSummaryAscii()));
// Root
Element root = document.createElement(XML_TAG);
root.setAttribute(XML_ATTRIBUTE_LANGUAGE, AD_Language);
root.setAttribute(XML_ATTRIBUTE_TABLE, Base_Table);
document.appendChild(root);
//
sql = new StringBuffer ("SELECT ");
if (isBaseLanguage)
sql.append("'Y',"); // 1
else
sql.append("t.IsTranslated,");
sql.append("t.").append(keyColumn); // 2
//
for (int i = 0; i < trlColumns.length; i++)
sql.append(", t.").append(trlColumns[i])
.append(",o.").append(trlColumns[i]).append(" AS ").append(trlColumns[i]).append("O");
//
sql.append(" FROM ").append(tableName).append(" t")
.append(" INNER JOIN ").append(Base_Table)
.append(" o ON (t.").append(keyColumn).append("=o.").append(keyColumn).append(")");
boolean haveWhere = false;
if (!isBaseLanguage)
{
sql.append(" WHERE t.AD_Language=?");
haveWhere = true;
}
if (m_IsCentrallyMaintained)
sql.append(haveWhere ? " AND " : " WHERE ").append("o.IsCentrallyMaintained='N'");
sql.append(" ORDER BY t.").append(keyColumn);
//
PreparedStatement pstmt = DB.prepareStatement(sql.toString());
if (!isBaseLanguage)
pstmt.setString(1, AD_Language);
ResultSet rs = pstmt.executeQuery();
int rows = 0;
while (rs.next())
{
Element row = document.createElement (XML_ROW_TAG);
row.setAttribute(XML_ROW_ATTRIBUTE_ID, String.valueOf(rs.getInt(2))); // KeyColumn
row.setAttribute(XML_ROW_ATTRIBUTE_TRANSLATED, rs.getString(1)); // IsTranslated
for (int i = 0; i < trlColumns.length; i++)
{
Element value = document.createElement (XML_VALUE_TAG);
value.setAttribute(XML_VALUE_ATTRIBUTE_COLUMN, trlColumns[i]);
String origString = rs.getString(trlColumns[i] + "O"); // Original Value
if (origString == null)
origString = "";
String valueString = rs.getString(trlColumns[i]); // Value
if (valueString == null)
valueString = "";
value.setAttribute(XML_VALUE_ATTRIBUTE_ORIGINAL, origString);
value.appendChild(document.createTextNode(valueString));
row.appendChild(value);
}
root.appendChild(row);
rows++;
}
rs.close();
pstmt.close();
Log.trace(Log.l6_Database, "Translation.exportTrl", "Records=" + rows
+ ", DTD=" + document.getDoctype());
//
DOMSource source = new DOMSource(document);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
// Output
out.createNewFile();
StreamResult result = new StreamResult(out);
// Transform
transformer.transform (source, result);
}
catch (SQLException e)
{
Log.error("Translation.exportTrl - " + sql.toString(), e);
}
catch (Exception e)
{
Log.error("Translation.exportTrl", e);
}
return "";
} // exportTrl
/**
* Get Columns for Table
* @param Base_Table table
* @return array of translated columns
*/
private String[] getTrlColumns (String Base_Table)
{
m_IsCentrallyMaintained = false;
String sql = "SELECT TableName FROM AD_Table t"
+ " INNER JOIN AD_Column c ON (c.AD_Table_ID=t.AD_Table_ID AND c.ColumnName='IsCentrallyMaintained') "
+ "WHERE t.TableName=? AND c.IsActive='Y'";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setString(1, Base_Table);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
m_IsCentrallyMaintained = true;
rs.close();
pstmt.close();
}
catch (SQLException e)
{
Log.error("Translation.getTrlColumns (IsCentrallyMaintained)", e);
}
sql = "SELECT ColumnName "
+ "FROM AD_Column c"
+ " INNER JOIN AD_Table t ON (c.AD_Table_ID=t.AD_Table_ID) "
+ "WHERE t.TableName=?"
+ " AND c.AD_Reference_ID IN (10,14) "
+ "ORDER BY IsMandatory DESC, ColumnName";
ArrayList list = new ArrayList();
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setString(1, Base_Table + "_Trl");
ResultSet rs = pstmt.executeQuery();
while (rs.next())
list.add(rs.getString(1));
rs.close();
pstmt.close();
}
catch (SQLException e)
{
Log.error("Translation.getTrlColumns", e);
}
// Convert to Array
String[] retValue = new String[list.size()];
list.toArray(retValue);
return retValue;
} // getTrlColumns
/*************************************************************************/
/**
* Validate Language.
* - Check if AD_Language record exists
* - Check Trl table records
* @param AD_Language language
*/
private void validateLanguage (String AD_Language)
{
String sql = "SELECT IsActive, IsSystemLanguage "
+ "FROM AD_Language "
+ "WHERE AD_Language=?";
boolean recordExists = false;
boolean isActive = false;
boolean isSystemLanguage = false;
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setString(1, AD_Language);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
recordExists = true;
isActive = "Y".equals(rs.getString(1));
isSystemLanguage = "Y".equals(rs.getString(2));
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
Log.error("Translation.validateLanguage - " + sql, e);
}
// Language exists
if (recordExists && isActive && isSystemLanguage)
{
Log.trace(Log.l3_Util, "Translation.validateLanguage - OK: " + AD_Language);
return;
}
// Create AD_Language Record
if (!recordExists)
{
StringBuffer sqlB = new StringBuffer ("INSERT INTO AD_LANGUAGE (AD_LANGUAGE,AD_CLIENT_ID,AD_ORG_ID, ISACTIVE,CREATED,CREATEDBY,UPDATED,UPDATEDBY,"
+ " NAME,ISBASELANGUAGE,ISSYSTEMLANGUAGE) ");
sqlB.append("VALUES ('").append(AD_Language).append("',0,0, 'Y',SysDate,0,SysDate,0, ")
.append("'").append(AD_Language).append("','N','Y')");
int no = DB.executeUpdate(sql.toString());
if (no == 1)
Log.trace(Log.l3_Util, "Translation.validateLanguage - Added: " + AD_Language);
else if (no == 0)
Log.error("Translation.validateLanguage - NOT Added: " + AD_Language);
else
Log.error("Translation.validateLanguage - Problem Adding " + AD_Language);
}
// Validate Translation
try
{
Log.trace(Log.l3_Util, "Translation.validateLanguage - Start Validating ... " + AD_Language);
sql = "{CALL AD_Language_Create(NULL)}";
CallableStatement cstmt = DB.prepareCall(sql);
cstmt.execute();
cstmt.close();
Log.trace(Log.l3_Util, "Translation.validateLanguage - Validation complete");
}
catch (SQLException e)
{
Log.error("Translation.validateLanguage", e);
}
} // validateLanguage
/**
* Process
* @param directory directory
* @param AD_Language language
* @param mode mode
*/
private void process (String directory, String AD_Language, String mode)
{
File dir = new File(directory);
if (!dir.exists())
dir.mkdir();
dir = new File(directory);
if (!dir.exists())
{
System.out.println("Cannot create directory " + directory);
System.exit(1);
}
String sql = "SELECT Name, TableName "
+ "FROM AD_Table "
+ "WHERE TableName LIKE '%_Trl' "
+ "ORDER BY 1";
ArrayList trlTables = new ArrayList();
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next())
trlTables.add(rs.getString(2));
rs.close();
pstmt.close();
}
catch (SQLException e)
{
Log.error("Translation.process (Table)", e);
}
for (int i = 0; i < trlTables.size(); i++)
{
String table = (String)trlTables.get(i);
if (mode.startsWith("i"))
importTrl(directory, AD_Language, table);
else
exportTrl(directory, AD_Language, table);
}
} // process
/**
* Batch Interface
* @param args directory AD_Language import/export
*/
public static void main (String[] args)
{
if (args.length != 3)
{
System.out.println("format : java Translation directory AD_Language import|export");
System.out.println("example: java Translation /Compiere2/data/de_DE de_DE import");
System.out.println("example: java Translation /Compiere2/data/fr_FR fr_FR export");
System.exit(1);
}
//
Env.initTest (6, false);
String directory = args[0];
String AD_Language = args[1];
String mode = args[2];
Translation trl = new Translation();
trl.validateLanguage (AD_Language);
trl.process (directory, AD_Language, mode);
System.exit(0);
} // main
} // Translation
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -