⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 translation.java

📁 Java写的ERP系统
💻 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 + -