Update: Please, download scripts from the dedicated SF.net project page where they are maintained. Scripts at the links below might be obsolete (though most likely still working).
Here I’d like to share two Groovy scripts that don’t help with anything at hand in OmegaT, but write out external text files that can often be helpful in producing better quality translation.
The first script writes selected text to a file along with some context information. This can be helpful if you need to produce a list of unknown/unclear term that need to be discussed with the client, or things to be double-checked, studied, rewritten etc.
- write_selection2list.groovy
/* * #Purpose: Write selection to a file to create a list of terms * #Files: Writes 'terms_list.txt' in the current project's root * the file contains selection text, segment number, segment text * and filename of the selection, if selection is in the current segment, * or just the text of selection and the filename, if selection * is outside the current segment. * #Note: When invoked without selection, it opens the file * in the default text editor * #Details: http : / / wp.me/p3fHEs-4L * * @author Kos Ivantsov * @based on scripts by Yu Tang * @date 2013-06-25 * @version 0.2 */ import static javax.swing.JOptionPane.* import static org.omegat.util.Platform.* // abort if a project is not opened yet def prop = project.projectProperties if (!prop) { final def title = 'Selection to List' final def msg = 'Please try again after you open a project.' showMessageDialog null, msg, title, INFORMATION_MESSAGE return } // get segment #, source filename and the whole current segment def srcfile = editor.currentFile def ste = editor.currentEntry cur_text = ste.getSrcText() cur_seg = ste.entryNum() // define list file def folder = prop.projectRoot def fileloc = folder+'/terms_list.txt' list_file = new File(fileloc) // create file if it doesn't exist if (! list_file.exists()) { list_file.write("",'UTF-8') } /* * command to open the file if there's no active selection * if a custom (not OS default) text editor should be used, * it needs to be defined in the next line (edit as needed and uncomment) */ // def textEditor = /path to your editor/ def command switch (osType) { case [OsType.WIN64, OsType.WIN32]: command = "cmd /c start \"\" \"$list_file\"" // default try { command = textEditor instanceof List ? [*textEditor, list_file] : "\"$textEditor\" \"$list_file\"" } catch (ignore) {} break case [OsType.MAC64, OsType.MAC32]: command = ['open', list_file] // default try { command = textEditor instanceof List ? [*textEditor, list_file] : ['open', '-a', textEditor, list_file] } catch (ignore) {} break default: // for Linux or others command = ['xdg-open', list_file] // default try { command = textEditor instanceof List ? [*textEditor, list_file] : [textEditor, list_file] } catch (ignore) {} break } def sel_txt = editor.selectedText if (sel_txt) { list_file.append "${'='*10}\n $sel_txt\n",'UTF-8' if (cur_text =~ sel_txt) { list_file.append "${'-'*5}\n\ filename: $srcfile\n\ segment: $cur_seg\n\ segment text: $cur_text \n\n",'UTF-8' }else{ list_file.append "${'-'*5}\n\ filename: $srcfile\n\ ***Selection outside of current segment***\n",'UTF-8' } console.println "\"$sel_txt\" written to $list_file" } else { console.println "[No selection]" console.println "***Opening the file in text editor***" console.println "Command: $command" command.execute() return // exit }
The list is created in the current OmegaT project folder, file is named
terms_list.txt
. When the script is invoked with no selection, this file is opened in the default text editor — so that you can easily view or edit the file. When it’s invoked with some text selected in the Editor pane, the selection gets written to the file along with some context info depending on whether selection is inside or outside of the current segment.
I’d like to write wider context, but I don’t know how to get text from previous and next segment without actually going there. Any help is welcome and appreciated, as usual.
The second script writes unique untranslated segments from the complete project into a text file named untranslated.txt
. This files is located in the project’s root folder, and is rewritten each time the script is invoked. Such file can be used for a number of purposes, including producing TMX with MT.
- write_untranslated2file.groovy
/* * #Purpose: Write all unique untranslated segments to a file * #Files: Writes 'untranslated.txt' in the current project's root * #Details: http : / / wp.me/p3fHEs-4L * * @author Kos Ivantsov * @based on scripts by Yu Tang * @date 2013-06-25 * @version 0.2 */ import static javax.swing.JOptionPane.* import static org.omegat.util.Platform.* // abort if a project is not opened yet def prop = project.projectProperties if (!prop) { final def title = 'Untranslated to File' final def msg = 'Please try again after you open a project.' showMessageDialog null, msg, title, INFORMATION_MESSAGE return } def folder = prop.projectRoot def fileloc = folder+'/untranslated.txt' writefile = new File(fileloc) writefile.write("", 'UTF-8') def count = 0 project.projectFiles .each { //console.println "\n${it.filePath}" it.entries .findAll {!project.getTranslationInfo(it).isTranslated()} .each {count++; writefile.append "${it.srcText}\n",'UTF-8'} } console.println "\nUntranslated segments found: $count" count = 0 def lines = writefile.readLines() uniqline = lines.unique() writefile.write("",'UTF-8') uniqline.each { writefile.append "$it\n",'UTF8'; } console.println "Unique untranslated segments written to file: $uniqline.size"
If you have ideas how to improve these, feel free to share.
UPDATE:
Here’s another script that writes all source segments to a file
But as of now,
Good luck!