blob: 80aedaa8f3b14b5633e2e024dc2955b7ceebdb2c [file] [log] [blame]
/*
*****************************************************************************
* Copyright (C) 2000-2007, International Business Machines Corporation and *
* others. All Rights Reserved. *
*****************************************************************************
*/
package com.ibm.rbm;
import java.io.*;
import javax.swing.*;
import java.util.*;
import org.apache.xerces.dom.DocumentImpl;
import org.apache.xml.serialize.*;
import org.w3c.dom.*;
/**
* This class is a plug-in to RBManager that allows the user to export Resource Bundles
* along with some of the meta-data associated by RBManager to the TMX specification.
* For more information on TMX visit the web site <a href="http://www.lisa.org/tmx/">http://www.lisa.org/tmx/</a>
*
* @author Jared Jackson
* @see com.ibm.rbm.RBManager
*/
public class RBTMXExporter extends RBExporter {
private static final String VERSION = "0.5a";
/**
* Default constructor for the TMX exporter.
*/
public RBTMXExporter() {
super();
// Initialize the file chooser if necessary
if (chooser == null) {
chooser = new JFileChooser();
chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
public String getDescription() {
return "TMX Files";
}
public boolean accept(File f) {
if (f.isDirectory()) return true;
if (f.getName().endsWith(".tmx")) return true;
return false;
}
});
} // end if
}
private String convertToISO(Date d) {
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(d);
return convertToISO(gc);
}
private String convertToISO(GregorianCalendar gc) {
StringBuffer buffer = new StringBuffer();
buffer.append(String.valueOf(gc.get(Calendar.YEAR)));
int month = gc.get(Calendar.MONTH)+1;
buffer.append(((month < 10) ? "0" : "") + String.valueOf(month));
int day = gc.get(Calendar.DAY_OF_MONTH);
buffer.append(((day < 10) ? "0" : "") + String.valueOf(day));
buffer.append("T");
int hour = gc.get(Calendar.HOUR_OF_DAY);
buffer.append(((hour < 10) ? "0" : "") + String.valueOf(hour));
int minute = gc.get(Calendar.MINUTE);
buffer.append(((minute < 10) ? "0" : "") + String.valueOf(minute));
int second = gc.get(Calendar.SECOND);
buffer.append(((second < 10) ? "0" : "") + String.valueOf(second));
buffer.append("Z");
return buffer.toString();
}
private String convertEncoding(BundleItem item) {
if (item != null && item.getParentGroup() != null && item.getParentGroup().getParentBundle() != null) {
String language = item.getParentGroup().getParentBundle().getLanguageEncoding();
String country = item.getParentGroup().getParentBundle().getCountryEncoding();
String variant = item.getParentGroup().getParentBundle().getVariantEncoding();
if (language != null && !language.equals("")) {
//language = language.toUpperCase();
if (country != null && !country.equals("")) {
//country = country.toUpperCase();
if (variant != null && !variant.equals("")) {
//variant = variant.toUpperCase();
return language + "-" + country + "-" + variant;
}
return language + "-" + country;
}
return language;
}
}
return "";
}
private void appendTUV(Document xml, Element tu, BundleItem item) {
Element tuv = xml.createElement("tuv");
tuv.setAttribute("lang", convertEncoding(item));
tuv.setAttribute("creationdate",convertToISO(item.getCreatedDate()));
tuv.setAttribute("creationid",item.getCreator());
tuv.setAttribute("changedate",convertToISO(item.getModifiedDate()));
tuv.setAttribute("changeid",item.getModifier());
item.getComment();
item.isTranslated();
Element comment_prop = xml.createElement("prop");
comment_prop.appendChild(xml.createTextNode(item.getComment()));
comment_prop.setAttribute("type","x-Comment");
tuv.appendChild(comment_prop);
Element translated_prop = xml.createElement("prop");
translated_prop.appendChild(xml.createTextNode(String.valueOf(item.isTranslated())));
translated_prop.setAttribute("type","x-Translated");
tuv.appendChild(translated_prop);
Hashtable lookups = item.getLookups();
Enumeration keys = lookups.keys();
while (keys.hasMoreElements()) {
String key = (String)keys.nextElement();
String value = (String)lookups.get(key);
Element lookup_prop = xml.createElement("prop");
lookup_prop.appendChild(xml.createTextNode(key + "=" + value));
lookup_prop.setAttribute("type","x-Lookup");
tuv.appendChild(lookup_prop);
}
Element seg = xml.createElement("seg");
seg.appendChild(xml.createTextNode(item.getTranslation()));
tuv.appendChild(seg);
tu.appendChild(tuv);
}
public void export(RBManager rbm) throws IOException {
if (rbm == null) return;
// Open the Save Dialog
int ret_val = chooser.showSaveDialog(null);
if (ret_val != JFileChooser.APPROVE_OPTION) return;
// Retrieve basic file information
File file = chooser.getSelectedFile(); // The file(s) we will be working with
File directory = new File(file.getParent()); // The directory we will be writing to
String base_name = file.getName(); // The base name of the files we will write
if (base_name == null || base_name.equals("")) base_name = rbm.getBaseClass();
if (base_name.endsWith(".tmx")) base_name = base_name.substring(0,base_name.length()-4);
String file_name = base_name + ".tmx";
Vector bundle_v = rbm.getBundles();
Bundle main_bundle = (Bundle)bundle_v.elementAt(0);
Document xml = new DocumentImpl();
Element root = xml.createElement("tmx");
root.setAttribute("version", "1.2");
xml.appendChild(root);
Element header = xml.createElement("header");
Element note = xml.createElement("note");
note.appendChild(xml.createTextNode("This document was created automatically by RBManager"));
header.appendChild(note);
header.setAttribute("creationtool", "RBManager");
header.setAttribute("creationtoolversion", VERSION);
header.setAttribute("datatype", "PlainText");
header.setAttribute("segtype", "sentance");
header.setAttribute("adminlang", "en-us");
header.setAttribute("srclang", "EN");
header.setAttribute("o-tmf", "none");
header.setAttribute("creationdate", convertToISO(new Date()));
root.appendChild(header);
Element body = xml.createElement("body");
root.appendChild(body);
Vector group_v = main_bundle.getGroupsAsVector();
// Loop through each bundle group in main_bundle
for (int i=0; i < group_v.size(); i++) {
BundleGroup main_group = (BundleGroup)group_v.elementAt(i);
// Gather a group of groups of the same name as main_group
Vector all_groups_v = new Vector();
for (int j=1; j < bundle_v.size(); j++) {
Bundle bundle = (Bundle)bundle_v.elementAt(j);
if (bundle.hasGroup(main_group.getName())) {
Vector groups = bundle.getGroupsAsVector();
for (int k=0; k < groups.size(); k++) {
BundleGroup group = (BundleGroup)groups.elementAt(k);
if (group.getName().equals(main_group.getName())) all_groups_v.addElement(group);
}
}
} // end for - j
// Loop through each item in main_group
for (int j=0; j < main_group.getItemCount(); j++) {
BundleItem main_item = main_group.getBundleItem(j);
Element tu = xml.createElement("tu");
tu.setAttribute("tuid",main_item.getKey());
tu.setAttribute("datatype","Text");
// Insert the group name for the item
Element group_prop = xml.createElement("prop");
group_prop.appendChild(xml.createTextNode(main_group.getName()));
group_prop.setAttribute("type", "x-Group");
tu.appendChild(group_prop);
// Add the main_item to the xml
appendTUV(xml, tu, main_item);
// Loop through the rest of the groups of the same name as main_group
for (int k=0; k < all_groups_v.size(); k++) {
BundleGroup group = (BundleGroup)all_groups_v.elementAt(k);
// Loop through the items in each group
for (int l=0; l < group.getItemCount(); l++) {
BundleItem item = group.getBundleItem(l);
if (item.getKey().equals(main_item.getKey())) {
appendTUV(xml, tu, item);
break;
}
} // end for - l
} // end for - k
body.appendChild(tu);
} // end for - j
} // end for - i
FileWriter fw = new FileWriter(new File(directory,file_name));
OutputFormat of = new OutputFormat(xml);
of.setIndenting(true);
of.setEncoding("ISO-8859-1");
XMLSerializer serializer = new XMLSerializer(fw, of);
serializer.serialize(xml);
}
}