views:

104

answers:

4

I found this utility, pytranslate, which translates a variety of languages into each other using Google's translation API. It works exactly as described.

However I've gotten sick of selecting a word I do not understand, then middle-clicking it into the command. The command format is as such:

pytranslate WORD

Is there a program/script that has the ability to detect when I select a word, or a series of words with my mouse, and then executes the above command with the selected text in the place of WORD in a terminal window?

Example:

Selected text:

Bonjour mondiale...

Resultant command/result:

pytranslate Bonjour mondiale
Detected source language: fr
Hello World
A: 

Note: this answer was useless to the questioner, who wasn't using Windows. Given that the title doesn't specify the OS, I'll leave it around for Windows users who may come this way.


You can easily whip one up yourself using the pywin32 package and the win32clipboard module. See, for example, this question.

I've done this in the past with a routine that just polled the clipboard periodically, every few seconds or so, and whenever it found a change it grabbed the contents and did something with it. In your case, use the subprocess package to call out to pytranslate with the text.

Peter Hansen
Since his middle button pasts the last selected text I'm guessing he's on *nix.
Richo
Also the Ubuntu-9.04 tag that I just noticed ;)BTW OP your select tag is probably lumping it in with the select() syscall.
Richo
Ah, good point. The use of the phrase "terminal window" should have been a give-away too. Also the "ubuntu-9.04" tag. :-)
Peter Hansen
Sorry I should've made it obvious, I'm running ubuntu 9.04.
Nazarius Kappertaal
http://www.answermysearches.com/python-how-to-copy-and-paste-to-the-clipboard-in-linux/286/, shows one how to use pygtk clipboard feature - and if a lump it with the windows one above - I'll see if I can get a working script.
Nazarius Kappertaal
I tried another answer, pointing to the same docs that that one points to, Nazarius. (As a newcomer to SO, I need to ask: should I delete this wrong answer, or just leave it here for posterity?)
Peter Hansen
Peter: if it's completely wrong, delete it. If it might be useful to someone, but doesn't answer this question: that's up to you, but should at least leave an explanation with it, if you don't delete.
Roger Pate
+1  A: 

Would you be able to use clipboard support in the PyGTK package to do the job? It claims to have access to the "primary" X clipboard which it says is where you'd normally find the selected text.

Peter Hansen
+4  A: 
#!/bin/bash
pytranslate "$(xsel -p)"

Now just put this in ~/bin (make sure that's included in your PATH), and run it. (You may need to install the xsel package.) It will take the current contents of the primary selection buffer and pass it to pytranslate.

If you want it as a button, create a launcher which runs this in a terminal, and use bash's read command to do "Press ENTER to continue".

Roger Pate
Brilliant one liner.
Nazarius Kappertaal
+2  A: 

Taking inspiration from Roger Pate's brilliant one liner I've created a simple looping script for pytranslate. This is currently provisional - as I haven't implemented error catching yet - wait for new edits.

#!/bin/bash
# Primary Clipboard poller using xsel (middle click) and pytranslate
# Checks for changes every 1 second
# If change has occured, a command is executed (pytranslate here)
########## Information ########## 
# It now stores definitions in a text file - saves bandwith and reduces hits on google (caseless)
# Works for Romance languagse
#TODO
# Character based langauges
# Catch errors

if [ ! -e "pytranslatecache" ]; then
touch pytranslatecache
fi

while [ 1 ]
do
   OLDENTRY="$(xsel -p)"
   sleep 1
   NEWENTRY="$(xsel -p)"
   if [ "$NEWENTRY" != "$OLDENTRY" ] ; then
     if [ "$(grep -F -o -i "$NEWENTRY" pytranslatecache)" = "$NEWENTRY" ] ; then
    echo "From Cache:"
        echo "$(grep -i "$NEWENTRY" pytranslatecache)" 
     else
    DEFINITION=""$(pytranslate -s fr "$(xsel -p)")""
        echo "$NEWENTRY"":"$DEFINITION
        echo "$NEWENTRY"":"$DEFINITION >> pytranslatecache
     fi
   fi
# Catch Errors - Commands
   if [ $? != 0 ]; then
   {
       echo "Failed to translate string."
    } fi
done
Nazarius Kappertaal