Is there any way to seamlessly translate a mail inside Mail.app?
Having recently moved to Germany, I receive tons of German emails.
My current workflow is definitely not efficient: Copy mail contents, goto translate.google.com, paste content..
The ideal solution would be: just trigger a shortcut and have the contents of the email translated into the predefined language you've set.
Would that be possible?
Solution 1:
Here is an applescript I just put together that is working for me (10.9)
You can place it in the Applescript menu and run it on the selected Emails.
The script will:
- Try and grab the select emails in Mail.
- Send a Request to google translate
- Convert the resulting HTML to plain text
- Display a temporary text file with the translation.
You can set the original language to auto or one of the languages in the languages_code list. And also set the result language from the list.
There is no reason you should not be able to create a service using this script. But I will leave that to you. Just note that for the device to work you will need to right click/crtl +click in a message's body for the service menu to show up. Or use the Services menu.
#http://macscripter.net/viewtopic.php?id=31218
#http://macscripter.net/viewtopic.php?id=39742
#The above links are the starting points of this script which both attempt to translate text. But are broken or do not return the full text.
#This script will attampt to translate the text from the selected emails to your chosen language
property languages_code : {Afrikaans:"af", Albanian:"sq", Arabic:"ar", Belarusian:"be", Bulgarian:"bg", Catalan:"ca", Chinese:"zh-CN", Croatian:"hr", Czech:"cs", Danish:"da", Dutch:"nl", English:"en", Estonian:"et", Filipino:"tl", Finnish:"fi", French:"fr", Galician:"gl", German:"de", Greek:"el", Hebrew:"iw", Hindi:"hi", Hungarian:"hu", Icelandic:"is", Indonesian:"id", Irish:"ga", Italian:"it", Japanese:"ja", Korean:"ko", Latvian:"lv", Lithuanian:"lt", Macedonian:"mk", Malay:"ms", Maltese:"mt", Norwegian:"no", Persian:"fa", Polish:"pl", Portuguese:"pt", Romanian:"ro", Russian:"ru", Serbian:"sr", Slovak:"sk", Slovenian:"sl", Spanish:"es", Swahili:"sw", Swedish:"sv", Thai:"th", Turkish:"tr", Ukrainian:"uk", Vietnamese:"vi", Welsh:"cy", Yiddish:"yi"}
#Curl stuff
property agent : "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
property charset : "UTF-8"
property header : "Charset:" & space & charset
property theURL : "https://translate.google.com/?" #This must be https
#used to delimit the html
property snipOpen : "TRANSLATED_TEXT="
property snipClose : ";INPUT_TOOL_PATH"
#You can either set a start language or leave it at auto.
property startLang : "auto"
#set a result language
property resultLang : English of languages_code
#Ask Mail to get and process selected emails
tell application "Mail"
set theMessages to (get selection)
repeat with i from 1 to number of items in theMessages
set this_item to item i of theMessages
set thisSender to sender of this_item
set thisSubject to subject of this_item
set thisText to content of this_item as string
my translate(thisSender, thisSubject, thisText)
end repeat
end tell
(*************** SUBROUTINES *****************)
#Translate the message text and display them in a temp text file
on translate(thisSender, thisSubject, thisText)
if thisText is not "" then
#replace all spaces with "%20" for the URL to use without error
set escapedText to findReplace(thisText, space, "%20")
#send request to google and get the returned HTML
set TranslatedText to do shell script "/usr/bin/curl" & space & ¬
"-A" & space & quoted form of agent & space & ¬
"-H" & space & quoted form of header & space & ¬
"-d" & space & quoted form of ("&ie=" & charset & "&oe=" & charset & "&langpair=" & startLang & "|" & resultLang & "&text=" & escapedText) & space & quoted form of theURL
try
#Use delimiters to split the text to just get the actual result part
set txt to Split(TranslatedText, snipOpen)'s item 2
set txt to Split(txt, snipClose)'s item 1
set displayText to ¬
"Sender: " & thisSender & "<br>" & ¬
"Subject: " & thisSubject & "<br>" & "<br>" & ¬
txt
#Use Textutil to strip any other rich text or HTML code out and convert to plain text. Then open in a text document
do shell script "echo " & quoted form of displayText & "|textutil -format html -convert txt -stdin -stdout | open -f"
on error errTxt number errNum
display dialog errTxt with title "Error# " & errNum buttons {"Cancel", "OK"} default button 2 with icon 0 giving up after 0
end try
end if
end translate
on Split(txt, del)
set {otid, AppleScript's text item delimiters} to {AppleScript's text item delimiters, del}
set txt to text items of txt
set AppleScript's text item delimiters to otid
return txt
end Split
on findReplace(theString, search_string, replacement_string)
if theString contains search_string then
set AppleScript's text item delimiters to search_string
set text_item_list to text items of theString
set AppleScript's text item delimiters to replacement_string
set theString to text_item_list as text
set AppleScript's text item delimiters to ""
end if
return theString
end findReplace