translate-2009.12.17: src/Text/Translate.hs
{-# LANGUAGE DeriveDataTypeable #-}
module Text.Translate (translate) where
import Text.JSON.Generic
import Network.Curl
import qualified Data.List as L
import Prelude hiding ((.), (-))
import Network.URI
-- http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=en|de&q=Hello+World
{-
{"responseData"=>{"translatedText"=>"Hallo Welt"},
"responseStatus"=>200,
"responseDetails"=>nil}
-}
curl :: String -> IO (Maybe String)
curl x = do
(r, s) <- curlGetString x []
if r == CurlOK
then return - Just s
else return Nothing
base_url :: String
base_url = "http://ajax.googleapis.com/ajax/services/language/translate"
trans_api :: String -> String -> String -> String
trans_api from to what =
let make_pair (x, y) = x ++ "=" ++ escape_uri y
in
base_url ++ "?" ++ [("v", "1.0"), ("langpair", from ++ "|" ++ to), ("q", what)] .map make_pair .join "&"
data RStatus = RStatus
{
responseStatus :: Integer
}
deriving (Eq, Show, Data, Typeable)
data RText = RText
{
translatedText :: String
}
deriving (Eq, Show, Data, Typeable)
data RGood = RGood
{
responseData :: RText
}
deriving (Eq, Show, Data, Typeable)
data RBad = RBad
{
responseDetails :: String
}
deriving (Eq, Show, Data, Typeable)
translate :: String -> String -> String -> IO (Maybe String)
translate from to what = do
r <- curl - trans_api from to what
case r of
Nothing -> return - Nothing
Just x ->
let status = x.decodeJSON
in
if status.responseStatus == 200
then do
let rgood = x.decodeJSON
return - Just - rgood.responseData.translatedText
else do
return Nothing
-- bolerplate
-- base DSL
{-# INLINE (.) #-}
(.) :: a -> (a -> b) -> b
a . f = f a
infixl 9 .
{-# INLINE (-) #-}
(-) :: (a -> b) -> a -> b
f - x = f x
infixr 0 -
join :: [a] -> [[a]] -> [a]
join = L.intercalate
escape_uri :: String -> String
escape_uri = escapeURIString isAllowedInURI