write_new_trans2TMX_extGUI.groovy
/*
* Purpose: Export new translations completed after the specified
* date (line 21) either for the entire project or for the
* selected files ("select_files" must be set to 'yes' — line 27)
* to TMX file
* #Files: Writes 'translated_after_<date_time>.tmx'
* in the current project's root
* #File format: TMX v.1.4
* #Details: http:/ /wp.me / p3fHEs-6z
*
* @author Kos Ivantsov
* @date 2013-08-12
* @version 0.3
*/
/*
* The date should be specified as "year-month-day HOURS:minutes"
* If not specified or specified wrongly, the script will look for
* translations that are newer than one day.
*/
def newdate = ''
/*
* Set "select_files" to 'yes' if you want to use file selector
* to specify files for export. If anything else is specified, the script
* will work with the complete project.
*/
select_files = ''
import javax.swing.JFileChooser
import org.omegat.util.StaticUtils
import org.omegat.util.TMXReader
import static javax.swing.JOptionPane.*
import static org.omegat.util.Platform.*
def prop = project.projectProperties
if (!prop) {
final def title = 'Export new translation'
final def msg = 'Please try again after you open a project.'
showMessageDialog null, msg, title, INFORMATION_MESSAGE
return
}
/*
* If you want to use an external date and time selector and a window to
* ask whether you want to select individual files, specify the whole path
* to that program/script. It should print out date in the proper format
* on the first line of the stout, and "yes" or anything else on the second
* line.
*/
def command = "/home/user/.omegat/script/new2tmx_tweak"
try {
proc = command.execute()
proc.waitFor()
//console.println "${proc.in.text}"
def lines = "${proc.in.text}".readLines()
newdate = lines[0]
select_files = lines[1]
}
catch(java.io.IOException ex){
if (ex.getMessage() =~ 'error=13'){
console.println "The program is not executable"
}
if (ex.getMessage() =~ 'error=2'){
console.println "The program is not found"
}
}
try {
newdate = new Date().parse("yyyy-MM-dd HH:mm", newdate)
}
catch (java.text.ParseException e) {
newdate = new Date().minus(1)
final def title = 'Wrong date format'
final def msg = """\
The date has been specified in a wrong format.
The script will work with entries exactly one day old,
i.e. changed after $newdate\
"""
console.println msg
showMessageDialog null, msg, title, INFORMATION_MESSAGE
}
namedate = new Date().parse("E MMM dd H:m:s z yyyy", newdate.toString()).format("MMM-dd-yyyy_HH.mm")
def fileloc = prop.projectRoot+'translated_after_'+namedate+"${ (select_files == 'yes') ? "_select" : ''}"+'.tmx'
exportfile = new File(fileloc)
if (prop.isSentenceSegmentingEnabled())
segmenting = TMXReader.SEG_SENTENCE
else
segmenting = TMXReader.SEG_PARAGRAPH
def sourceLocale = prop.getSourceLanguage().toString()
def targetLocale = prop.getTargetLanguage().toString()
exportfile.write("", 'UTF-8')
exportfile.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", 'UTF-8')
exportfile.append("<!DOCTYPE tmx SYSTEM \"tmx11.dtd\">\n", 'UTF-8')
exportfile.append("<tmx version=\"1.4\">\n", 'UTF-8')
exportfile.append(" <header\n", 'UTF-8')
exportfile.append(" creationtool=\"OmegaTScripting\"\n", 'UTF-8')
exportfile.append(" segtype=\"" + segmenting + "\"\n", 'UTF-8')
exportfile.append(" o-tmf=\"OmegaT TMX\"\n", 'UTF-8')
exportfile.append(" adminlang=\"EN-US\"\n", 'UTF-8')
exportfile.append(" srclang=\"" + sourceLocale + "\"\n", 'UTF-8')
exportfile.append(" datatype=\"plaintext\"\n", 'UTF-8')
exportfile.append(" >\n", 'UTF-8')
def hitcount = 0
if ((select_files == 'yes')) {
srcroot = new File(prop.getSourceRoot())
sourceroot = prop.getSourceRoot().toString() as String
JFileChooser fc = new JFileChooser(
currentDirectory: srcroot,
dialogTitle: "Choose files to export",
fileSelectionMode: JFileChooser.FILES_ONLY,
//the file filter must show also directories, in order to be able to look into them
multiSelectionEnabled: true)
if(fc.showOpenDialog() != JFileChooser.APPROVE_OPTION) {
console.println "Canceled"
return
}
if (!(fc.selectedFiles =~ sourceroot.replaceAll(/\\+/, '\\\\\\\\'))) {
console.println "Selection outside of ${prop.getSourceRoot()} folder"
final def title = 'Wrong file(s) selected'
final def msg = "Files must be in ${prop.getSourceRoot()} folder."
showMessageDialog null, msg, title, INFORMATION_MESSAGE
return
}
fc.selectedFiles.each {
fl = "${it.toString()}" - "$sourceroot"
exportfile.append(" <prop type=\"Filename\">" + fl + "</prop>\n", 'UTF-8')
}
exportfile.append(" </header>\n", 'UTF-8')
exportfile.append(" <body>\n", 'UTF-8')
fc.selectedFiles.each{
fl = "${it.toString()}" - "$sourceroot"
files = project.projectFiles
files.each{
if ( "${it.filePath}" != "$fl" ) {
println "Skipping to the next file"
}else{
it.entries.each {
def info = project.getTranslationInfo(it)
def changeId = info.changer
def changeDate = info.changeDate
def creationId = info.creator
def creationDate = info.creationDate
def alt = 'unknown'
if (info.isTranslated()) {
if (newdate.before(new Date(changeDate))){
hitcount++
source = StaticUtils.makeValidXML(it.srcText)
target = StaticUtils.makeValidXML(info.translation)
exportfile.append(" <tu>\n", 'UTF-8')
exportfile.append(" <tuv xml:lang=\"" + sourceLocale + "\">\n", 'UTF-8')
exportfile.append(" <seg>" + "$source" + "</seg>\n", 'UTF-8')
exportfile.append(" </tuv>\n", 'UTF-8')
exportfile.append(" <tuv xml:lang=\"" + targetLocale + "\"", 'UTF-8')
exportfile.append(" changeid=\"${changeId ?: alt }\"", 'UTF-8')
exportfile.append(" changedate=\"${ changeDate > 0 ? new Date(changeDate).format("yyyyMMdd'T'HHmmss'Z'") : alt }\"", 'UTF-8')
exportfile.append(" creationid=\"${creationId ?: alt }\"", 'UTF-8')
exportfile.append(" creationdate=\"${ creationDate > 0 ? new Date(creationDate).format("yyyyMMdd'T'HHmmss'Z'") : alt }\"", 'UTF-8')
exportfile.append(">\n", 'UTF-8')
exportfile.append(" <seg>" + "$target" + "</seg>\n", 'UTF-8')
exportfile.append(" </tuv>\n", 'UTF-8')
exportfile.append(" </tu>\n", 'UTF-8')
}
}
}
}
}
}
} else {
exportfile.append(" </header>\n", 'UTF-8')
exportfile.append(" <body>\n", 'UTF-8')
files = project.projectFiles
files.each {
it.entries.each {
def info = project.getTranslationInfo(it)
def changeId = info.changer
def changeDate = info.changeDate
def creationId = info.creator
def creationDate = info.creationDate
def alt = 'unknown'
if (info.isTranslated()) {
if (newdate.before(new Date(changeDate))){
hitcount++
source = StaticUtils.makeValidXML(it.srcText)
target = StaticUtils.makeValidXML(info.translation)
exportfile.append(" <tu>\n", 'UTF-8')
exportfile.append(" <tuv xml:lang=\"" + sourceLocale + "\">\n", 'UTF-8')
exportfile.append(" <seg>" + "$source" + "</seg>\n", 'UTF-8')
exportfile.append(" </tuv>\n", 'UTF-8')
exportfile.append(" <tuv xml:lang=\"" + targetLocale + "\"", 'UTF-8')
exportfile.append(" changeid=\"${changeId ?: alt }\"", 'UTF-8')
exportfile.append(" changedate=\"${ changeDate > 0 ? new Date(changeDate).format("yyyyMMdd'T'HHmmss'Z'") : alt }\"", 'UTF-8')
exportfile.append(" creationid=\"${creationId ?: alt }\"", 'UTF-8')
exportfile.append(" creationdate=\"${ creationDate > 0 ? new Date(creationDate).format("yyyyMMdd'T'HHmmss'Z'") : alt }\"", 'UTF-8')
exportfile.append(">\n", 'UTF-8')
exportfile.append(" <seg>" + "$target" + "</seg>\n", 'UTF-8')
exportfile.append(" </tuv>\n", 'UTF-8')
exportfile.append(" </tu>\n", 'UTF-8')
}
}
}
}
}
exportfile.append(" </body>\n", 'UTF-8')
exportfile.append("</tmx>", 'UTF-8')
final def title = 'TMX file written'
final def msg = "$hitcount TU's written to " + exportfile.toString()
console.println msg
showMessageDialog null, msg, title, INFORMATION_MESSAGE
return
The only difference compared to the previous version is lines 43-66. The external program is specified in line 50.