]> gitweb.factorcode.org Git - factor.git/blob - extra/google/translate/translate.factor
change ERROR: words from throw-foo back to foo.
[factor.git] / extra / google / translate / translate.factor
1 ! Copyright (C) 2010 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: assocs combinators fry grouping http.client io
4 io.encodings.binary io.files io.files.unique json.reader kernel
5 locals make namespaces sequences urls ;
6 IN: google.translate
7
8 CONSTANT: google-translate-url "http://ajax.googleapis.com/ajax/services/language/translate"
9
10 CONSTANT: maximum-translation-size 5120
11
12 : parameters>assoc ( text from to -- assoc )
13     "|" glue [
14         [ "q" ,, ] [ "langpair" ,, ] bi*
15         "1.0" "v" ,,
16     ] { } make ;
17
18 : assoc>query-response ( assoc -- response )
19     google-translate-url http-post nip ;
20
21 TUPLE: response-error response error ;
22
23 : throw-response-error ( response -- * )
24     [ ] [ "responseDetails" of ] bi response-error boa throw ;
25
26 : check-response ( response -- response )
27     "responseStatus" over at {
28         { 200 [ ] }
29         { 400 [ response-error ] }
30         [ drop response-error ]
31     } case ;
32
33 : query-response>text ( response -- text )
34     json> check-response
35     "responseData" of
36     "translatedText" of ;
37
38 : (translate) ( text from to -- text' )
39     parameters>assoc
40     assoc>query-response
41     query-response>text ;
42
43 : translate ( text from to -- text' )
44     [ maximum-translation-size group ] 2dip
45     '[ _ _ (translate) ] map concat ;
46
47 :: translation-party ( text source target -- )
48     text dup print [
49         dup source target translate dup print
50         target source translate dup print
51         swap dupd = not
52     ] loop drop ;
53
54 : translate-tts ( text -- file )
55     "http://translate.google.com/translate_tts?tl=en" >url
56     swap "q" set-query-param "" ".mp3" make-unique-file
57     [ download-to ] keep ;
58
59 ! Example:
60 ! "dog" "en" "de" translate .
61 ! "Hund"