module BingTranslate ( detectLanguage, getLanguages, translateText ) where import GetURL import Text.XML.Light import Text.Printf import Data.ByteString.UTF8 as UTF8 -- Simon Marlow's AppId, please get your own from http://msdn.microsoft.com/en-us/library/ff512386.aspx myAppId = "3157F269F56493B5581BAA4AE7B99C35052DA38B" -- New v2 API: getlanguagesUri = "http://api.microsofttranslator.com/v2/Http.svc/GetLanguagesForTranslate?appId=" ++ myAppId detectUri = "http://api.microsofttranslator.com/v2/Http.svc/Detect?appId=" ++ myAppId translateUri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=" ++ myAppId getLanguages :: IO [String] getLanguages = do r <- getURL getlanguagesUri return (getLangs (parseXML r)) detectLanguage :: String -> IO String detectLanguage text = do r <- getURL (detectUri ++ "&text=" ++ text) return (head (map getString (parseXML r))) translateText :: String -> String -> String -> IO String translateText text fromLang toLang = do r <- getURL (printf "%s&text=%s&from=%s&to=%s" translateUri text fromLang toLang) return (concat (map getString (parseXML (UTF8.toString r)))) ----------------------------------------------------------------------------- -- Hacky XML decoding -- This will fail utterly if the input is not in the right form. getLangs :: [Content] -> [String] getLangs [Elem (Element {elName = QName { qName = "ArrayOfstring" }, elContent = strs })] = map getString strs getString :: Content -> String getString (Elem (Element {elName = QName { qName = "string" }, elContent = [Text (CData { cdData = str })]})) = str -- OLD stuff that we might need later: -- httpRequestUTF8 :: String -> Maybe ByteString -> IO String -- httpRequestUTF8 url body = do -- let request_hdr = postRequest url -- request | Just text <- body = request_hdr `addRequestContent` text -- | otherwise = request_hdr -- s <- simpleHTTP request >>= getResponseBody -- return (chopBOM (UTF8.toString s)) -- -- chopBOM ('\xfeff' : s) = s -- chopBOM s = s -- -- postRequest :: HStream a => String -> Request a -- postRequest urlString = -- case parseURI urlString of -- Nothing -> error ("postRequest: Not a valid URL - " ++ urlString) -- Just u -> mkRequest POST u -- -- addRequestContent :: Request ByteString -> ByteString -> Request ByteString -- addRequestContent rq content -- = rq {rqBody = content, -- rqHeaders = -- mkHeader HdrContentType "text/plain" : -- mkHeader HdrContentLength (show (B.length content)) : rqHeaders rq -- }