]> git.llucax.com Git - personal/website.git/blob - source/blog/posts/2012/09/gt
Import personal website to git
[personal/website.git] / source / blog / posts / 2012 / 09 / gt
1 #!/usr/bin/env python3
2
3 import json
4 import sys
5 import re
6 from urllib.request import urlopen, Request
7 from urllib.parse import urlencode
8 from argparse import ArgumentParser
9
10
11 def die(msg, *args):
12         sys.stderr.write((msg % args) + '\n')
13         sys.exit(1)
14
15
16 def translate(text, dst_lang, src_lang='auto'):
17         params = dict(
18                         client   = 't',
19                         hl       = 'en',
20                         multires = 1,
21                         otf      = 2,
22                         pc       = 1,
23                         ssel     = 0,
24                         tsel     = 0,
25                         sc       = 1,
26                         text     = text,
27                         sl       = src_lang,
28                         tl       = dst_lang,
29                 )
30         url = 'http://translate.google.com/translate_a/t'
31         data = ('client=t&' + urlencode(dict(text=text)) + '&hl=en&' +
32                         urlencode(dict(sl=src_lang)) + '&' +
33                         urlencode(dict(tl=dst_lang)) +
34                         '&multires=1&otf=2&pc=1&ssel=0&tsel=0&sc=1')
35         headers = { 'User-agent': 'Mozilla/5.0' }
36
37         req = Request(url=url, data=data.encode('utf-8'), headers=headers)
38         page = urlopen(req).read().decode('utf-8')
39         # attempt to fix invalid json (will break translated text that had ,,+)
40         page = re.sub(',,+', ',', page)
41
42         try:
43                 result = json.loads(page)
44         except Exception as e:
45                 die("Error parsing results: %s", e)
46
47         return ''.join((c[0] for c in result[0]))
48
49
50 def parse_args():
51         parser = ArgumentParser(description='Translate text using '
52                         'Google Translate.')
53         parser.add_argument('--from','-f', dest='from_', metavar='LANG',
54                         default='auto',
55                         help='Translate from LANG language '
56                                 '(e.g. en, de, es, default: auto)')
57         parser.add_argument('--to', '-t', metavar='LANG', default='en',
58                         help='Translate to LANG language '
59                                 '(e.g. en, de, es, default: en)')
60         parser.add_argument('--input-file', '-i', metavar='FILE',
61                         help='Get text to translate from FILE instead of stdin')
62         parser.add_argument('--output-file', '-o', metavar='FILE',
63                         help='Output translated text to FILE instead of stdout')
64         parser.add_argument('--input-encoding', '-I', metavar='ENC',
65                         help='Use ENC caracter encoding to read the input '
66                                 '(default: get from locale)')
67         parser.add_argument('--output-encoding', '-O', metavar='ENC',
68                         help='Use ENC caracter encoding to write the output '
69                                 '(default: get from locale)')
70
71         args = parser.parse_args()
72
73         args.input = sys.stdin
74         if args.input_file:
75                 try:
76                         args.input = open(args.input_file)
77                 except Exception as e:
78                         die("Can't open file %s for reading: %s",
79                                         args.input_file, e)
80
81         args.output = sys.stdout
82         if args.output_file:
83                 try:
84                         args.output = open(args.output_file, 'w')
85                 except Exception as e:
86                         die("Can't open file %s for writing: %s",
87                                         args.output_file, e)
88
89         return args
90
91
92 args = parse_args()
93 if args.input_encoding:
94         text = args.input.buffer.read().decode(args.input_encoding)
95 else:
96         text = args.input.read()
97 trans_text = translate(text, args.to, args.from_) + '\n'
98 if args.input_encoding:
99         args.output.buffer.write(trans_text.encode(args.input_encoding))
100 else:
101         args.output.write(trans_text)
102