#!/usr/bin/python

# tz_google_translate.py
#       --copyright--                   Copyright 2011 (C) Tranzoa, Co. All rights reserved.    Warranty: You're free and on your own here. This code is not necessarily up-to-date or of public quality.
#       --url--                         http://www.tranzoa.net/tzpython/
#       --email--                       pycode is the name to send to. tranzoa.com is the place to send to.
#       --bodstamps--
#       October 25, 2011        bar
#       November 29, 2011       bar     pyflake cleanup
#       May 27, 2012            bar     doxygen namespace
#       --eodstamps--
##      \file
#       \namespace              tzpython.tz_google_translate
#
#
#       Use google ajax to translate text.
#
#       Apparently won't work after Dec 2011.
#
#

import  urllib
import  urllib2

try :
    import  json                            # python 2.6 has this?
    if  not hasattr(json, 'read') :
        json.read   = json.loads
    pass
except ImportError :
    try :
        import    jsonlib                   # well, otherwise, I have jsonlib installed
        json    = jsonlib
    except ImportError :
        import   simplejson as json
        json.read   = json.loads
        json.write  = json.dumps
    pass


import  tzlib
import  url_getter



FROM_LANG   = 'en'
TO_LANG     = 'es'



def translate_text(txt, f_lang, t_lang) :
    try     :
        txt = txt.encode('utf8')
    except UnicodeDecodeError :
        pass

    # url   = "http://10.0.0.101/ajax/services/language/translate?q="
    url     = "http://ajax.googleapis.com/ajax/services/language/translate?q="

    url    += urllib.quote_plus(txt)
    url    += "&v=1.0&langpair=%s%%7c%s" % ( f_lang, t_lang, )

    req     = urllib2.Request(url)
    req.add_header('User-Agent',        'Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007')
    # req.add_header('User-Agent',      'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.23) Gecko/20110921 Ubuntu/10.04 (lucid) Firefox/3.6.23')
    req.add_header('Accept',            '*/*')
    req.add_header('Accept-Language',   'en-us,en;q=0.5')
    req.add_header('Accept-Charset',    'ISO-8859-1,utf-8;q=0.7,*;q=0.7')
    req.add_header('Referer',           'http://www.tranzoa.net/')

    s       = url_getter.url_open_read_with_timeout(req, timeout = 10.0)

    # print "@@@@", f_lang, t_lang, s
    if  s   :
        s   = json.read(s)
        r   = s.get('responseStatus', 0)
        if  r  == 200 :
            s   = s.get('responseData', {}).get('translatedText', None)
        else :
            s   = None
        pass

    return(s)






help_str    = """
%s (options) input_file (output_file)

Translate the text in the input file.

Options:
    --from      language    When language to translate from (default: %s)
    --to        language    When language to translate to   (default: %s)
                                Multiple --to's can be given.
    --text      text        Do not read input file. Translate the given text.
    --output    file_name   Set the output file name.
"""


if __name__ == '__main__' :

    import  os
    import  random
    import  sys
    import  time

    import  TZCommandLineAtFile


    program_name    = sys.argv.pop(0)
    TZCommandLineAtFile.expand_at_sign_command_line_files(sys.argv)


    f_lang      = None
    t_langs     = []
    txt         = ""
    ofile_name  = None

    if  tzlib.array_find(sys.argv, [ "--help", "-h", "-?", "/?", "-?" ] ) >= 0 :
        print help_str % ( os.path.basename(program_name), FROM_LANG, TO_LANG, )
        sys.exit(254)


    while True :
        oi  = tzlib.array_find(sys.argv, [ "--from", "--from_lang", "--from-lang", "--fromlang", "--f_lang", "--f-lang", "--flang", "--from_lng", "--from-lng", "--fromlng", "--fl", "-f", ])
        if  oi < 0 :    break
        del sys.argv[oi]
        f_lang      = sys.argv.pop(oi)


    while True :
        oi  = tzlib.array_find(sys.argv, [ "--to", "--to_lang", "--to-lang", "--tolang", "--t_lang", "--t-lang", "--tlang", "--to_lng", "--to-lng", "--tolng", "--tl", "-t", ])
        if  oi < 0 :    break
        del sys.argv[oi]
        t_langs.append(sys.argv.pop(oi))

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--text", "--txt", "-x", ])
        if  oi < 0 :    break
        del sys.argv[oi]
        txt         = sys.argv.pop(oi)

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--output", "-o", ])
        if  oi < 0 :    break
        del sys.argv[oi]
        ofile_name  = sys.argv.pop(oi)



    if  not txt :
        if  not sys.argv :
            print >>sys.stderr, "Please tell me an input file name!"
            sys.exit(101)

        fn  = sys.argv.pop(0)
        txt = tzlib.read_whole_text_file(fn)
        if  fn.startswith("-") :
            print >>sys.stderr, "Sorry. I don't input from files with names beginning with dashes! Put the path in front of the file name, %s."  % fn
            sys.exit(102)
        pass
    if  not txt :
        print >>sys.stderr, "No text to translate!"
        sys.exit(103)
    if  len(txt) > 3000 :
        print >>sys.stderr, "I won't do over 3000 characters!"
        sys.exit(103)

    if  not ofile_name  :
        ofile_name      = ""
        if  sys.argv    :
            ofile_name  = sys.argv.pop(0)
            if  ofile_name.startswith("-") :
                print >>sys.stderr, "Sorry. I don't output to files with names beginning with dashes! Put the path in front of the file name, %s."  % ofile_name
                sys.exit(102)
            pass
        pass

    if  sys.argv :
        print >>sys.stderr, "Extra command line parameters [%s]...!" % sys.argv[0]
        sys.exit(111)


    f_lang  = f_lang    or FROM_LANG
    if  not len(t_langs) :
        t_langs = [ TO_LANG ]

    for ti, tl in enumerate(t_langs) :
        if  ti  :
            time.sleep(random.random() * 5)
        ntxt    = translate_text(txt, f_lang, tl)
        if  not ntxt :
            print >>sys.stderr, "Translation failed from %s to %s at %s!" % ( f_lang, tl, ntxt, )
            sys.exit(104)
        txt     = ntxt
        f_lang  = tl

    if  ofile_name :
        tzlib.write_whole_text_file(ofile_name, txt)
    else :
        print txt
    pass


#
#
# eof
