google-translate (empty) → 0.1.0.0
raw patch · 4 files changed
+552/−0 lines, 4 filesdep +aesondep +basedep +bytestringsetup-changed
Dependencies added: aeson, base, bytestring, either, servant, servant-client, text
Files
- LICENSE +26/−0
- Setup.lhs +4/−0
- google-translate.cabal +27/−0
- src/Web/Google/Translate.hs +495/−0
+ LICENSE view
@@ -0,0 +1,26 @@+Copyright (c) 2015, David Johnson+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.lhs view
@@ -0,0 +1,4 @@+#! /usr/bin/env runhaskell++> import Distribution.Simple+> main = defaultMain
+ google-translate.cabal view
@@ -0,0 +1,27 @@+name: google-translate+version: 0.1.0.0+synopsis: Google Translate API bindings+license: BSD3+license-file: LICENSE+author: David Johnson+maintainer: djohnson.m@gmail.com+copyright: David Johnson (c) 2016+category: Web+build-type: Simple+cabal-version: >=1.10+description: Google Translate Library+library+ exposed-modules: Web.Google.Translate+ hs-source-dirs: src+ build-depends: aeson+ , base >= 4.7 && < 5+ , bytestring == 0.10.*+ , either == 4.4.*+ , servant == 0.4.*+ , servant-client == 0.4.*+ , text == 1.2.*+ default-language: Haskell2010++source-repository head+ type: git+ location: https://github.com/dmjio/google-translate
+ src/Web/Google/Translate.hs view
@@ -0,0 +1,495 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE DataKinds #-}+------------------------------------------------------------------------------+-- |+-- Module : Web.Google.Translate+-- Copyright : (c) David Johnson 2015+-- Maintainer : djohnson.m@gmail.com+-- Stability : experimental+-- Portability : POSIX+--+------------------------------------------------------------------------------+module Web.Google.Translate+ ( -- * Functions+ detect+ , getLanguages+ , translate+ -- * Types+ , Key (..)+ , Source (..)+ , Target (..)+ , Body (..)+ , Lang (..)+ , Confidence (..)+ , IsReliable (..)+ , TranslatedText (..)+ , TranslationResponse (..)+ , Translation (..)+ , DetectionResponse (..)+ , Detection (..)+ , LanguageResponse (..)+ , LanguageName (..)+ , Language (..)+ ) where+------------------------------------------------------------------------------+import Control.Monad.Trans.Either+import Data.Aeson+import Data.Aeson.Types+import Data.Proxy+import Data.Text (Text)+import qualified Data.Text as T+import GHC.Generics+import Servant.API+import Servant.Client+------------------------------------------------------------------------------+-- | API Key+newtype Key = Key Text+ deriving (ToText, FromText, Show, Eq, Ord)+------------------------------------------------------------------------------+-- | Source Language+newtype Source = Source Lang+ deriving (ToText, FromText, Show, Eq, Ord)+------------------------------------------------------------------------------+-- | Target Language+newtype Target = Target Lang+ deriving (ToText, FromText, Show, Eq, Ord)+------------------------------------------------------------------------------+-- | Text for translation+newtype Body = Body Text+ deriving (ToText, FromText, Show, Eq, Ord)+------------------------------------------------------------------------------+-- | Translated Text+newtype TranslatedText = TranslatedText Text+ deriving (ToText, FromText, Show, Eq, Ord, FromJSON)+------------------------------------------------------------------------------+-- | Translation Reponse+data TranslationResponse = TranslationResponse {+ translations :: [ Translation ]+ } deriving (Show, Eq, Ord, Generic)+------------------------------------------------------------------------------+instance FromJSON TranslationResponse where+ parseJSON (Object o) = do+ d <- o .: "data"+ TranslationResponse <$> d .: "translations"+------------------------------------------------------------------------------+-- | Translation +data Translation = Translation {+ translatedText :: TranslatedText+ , detectedSourceLanguage :: Maybe Lang+ } deriving (Show, Eq, Generic, Ord)+------------------------------------------------------------------------------+instance FromJSON Translation+------------------------------------------------------------------------------+-- | Deletion Response+data DetectionResponse = DetectionResponse {+ detections :: [ [Detection] ]+ } deriving (Show, Eq, Ord, Generic)+------------------------------------------------------------------------------+instance FromJSON DetectionResponse where+ parseJSON (Object o) = do+ d <- o .: "data"+ DetectionResponse <$> d .: "detections"+------------------------------------------------------------------------------+-- | Detection+data Detection = Detection {+ language :: Lang+ , isReliable :: IsReliable+ , confidence :: Confidence+ } deriving (Show, Eq, Generic, Ord)+------------------------------------------------------------------------------+-- | Confidence+newtype Confidence = Confidence Double deriving (Show, Eq, Ord, FromJSON)+------------------------------------------------------------------------------+-- | IsReliable+newtype IsReliable = IsReliable Bool deriving (Show, Eq, Ord, FromJSON)+------------------------------------------------------------------------------+instance FromJSON Detection+------------------------------------------------------------------------------+-- | Language Response+data LanguageResponse = LanguageResponse {+ languages :: [Language]+ } deriving (Show, Eq, Ord, Generic)+------------------------------------------------------------------------------+instance FromJSON LanguageResponse where+ parseJSON (Object o) = do+ d <- o .: "data"+ LanguageResponse <$> d .: "languages"+------------------------------------------------------------------------------+-- | Language +data Language = Language {+ lang :: Lang+ , name :: Maybe LanguageName+ } deriving (Show, Eq, Generic, Ord)+------------------------------------------------------------------------------+instance FromJSON Language where+ parseJSON (Object o) = Language <$> o .: "language" <*> o .:? "name"+------------------------------------------------------------------------------+-- | Language Name+newtype LanguageName = LanguageName Text deriving (Show, Eq, Ord, FromJSON)+------------------------------------------------------------------------------+-- | Google Translate API+type API = "language"+ :> "translate"+ :> "v2"+ :> QueryParam "key" Key+ :> QueryParam "source" Source+ :> QueryParam "target" Target+ :> QueryParam "q" Body+ :> Get '[JSON] TranslationResponse+ :<|>+ "language"+ :> "translate"+ :> "v2"+ :> "detect"+ :> QueryParam "key" Key+ :> QueryParam "q" Body+ :> Get '[JSON] DetectionResponse+ :<|>+ "language"+ :> "translate"+ :> "v2"+ :> "languages"+ :> QueryParam "key" Key+ :> QueryParam "target" Target+ :> Get '[JSON] LanguageResponse+------------------------------------------------------------------------------+api :: Proxy API+api = Proxy+------------------------------------------------------------------------------+translate'+ :: Maybe Key+ -> Maybe Source+ -> Maybe Target+ -> Maybe Body+ -> EitherT ServantError IO TranslationResponse+detect'+ :: Maybe Key+ -> Maybe Body+ -> EitherT ServantError IO DetectionResponse+translate' :<|> detect' :<|> getLanguages' = client api (BaseUrl Https "www.googleapis.com" 443)+------------------------------------------------------------------------------+-- | Detect target language+detect+ :: Key+ -> Body+ -> IO (Either ServantError DetectionResponse)+detect key body = runEitherT $ detect' (Just key) (Just body)+------------------------------------------------------------------------------+-- | Perform translation from `Source` language to `Target` langauge.+-- If `Source` not specified, attempt detection of `Lang`+translate+ :: Key+ -> Maybe Source+ -> Target+ -> Body+ -> IO (Either ServantError TranslationResponse)+translate key src trgt body =+ runEitherT $ translate' (Just key) src (Just trgt) (Just body)+------------------------------------------------------------------------------+-- | Retrieve all languages+-- If `Target` specified, return langauge name in `Target` langauge.+getLanguages + :: Key+ -> Maybe Target+ -> IO (Either ServantError LanguageResponse)+getLanguages key trgt = runEitherT $ getLanguages' (Just key) trgt+------------------------------------------------------------------------------+toTxt :: Show a => a -> Text+toTxt = T.pack . show +------------------------------------------------------------------------------+instance Show Lang where+ show Afrikaans = "af"+ show Albanian = "sq"+ show Arabic = "ar"+ show Armenian = "hy"+ show Azerbaijani = "az"+ show Basque = "eu"+ show Belarusian = "be"+ show Bengali = "bn"+ show Bosnian = "bs"+ show Bulgarian = "bg"+ show Catalan = "ca"+ show Cebuano = "ceb"+ show Chichewa = "ny"+ show ChineseSimplified = "zh"+ show ChineseTraditional = "zh-TW"+ show Croatian = "hr"+ show Czech = "cs"+ show Danish = "da"+ show Dutch = "nl"+ show English = "en"+ show Esperanto = "eo"+ show Estonian = "et"+ show Filipino = "tl"+ show Finnish = "fi"+ show French = "fr"+ show Galician = "gl"+ show Georgian = "ka"+ show German = "de"+ show Greek = "el"+ show Gujarati = "gu"+ show HaitianCreole = "ht"+ show Hausa = "ha"+ show Hebrew = "iw"+ show Hindi = "hi"+ show Hmong = "hmn"+ show Hungarian = "hu"+ show Icelandic = "is"+ show Igbo = "ig"+ show Indonesian = "id"+ show Irish = "ga"+ show Italian = "it"+ show Japanese = "ja"+ show Javanese = "jw"+ show Kannada = "kn"+ show Kazakh = "kk"+ show Khmer = "km"+ show Korean = "ko"+ show Lao = "lo"+ show Latin = "la"+ show Latvian = "lv"+ show Lithuanian = "lt"+ show Macedonian = "mk"+ show Malagasy = "mg"+ show Malay = "ms"+ show Malayalam = "ml"+ show Maltese = "mt"+ show Maori = "mi"+ show Marathi = "mr"+ show Mongolian = "mn"+ show MyanmarBurmese = "my"+ show Nepali = "ne"+ show Norwegian = "no"+ show Persian = "fa"+ show Polish = "pl"+ show Portuguese = "pt"+ show Punjabi = "pa"+ show Romanian = "ro"+ show Russian = "ru"+ show Serbian = "sr"+ show Sesotho = "st"+ show Sinhala = "si"+ show Slovak = "sk"+ show Slovenian = "sl"+ show Somali = "so"+ show Spanish = "es"+ show Sundanese = "su"+ show Swahili = "sw"+ show Swedish = "sv"+ show Tajik = "tg"+ show Tamil = "ta"+ show Telugu = "te"+ show Thai = "th"+ show Turkish = "tr"+ show Ukrainian = "uk"+ show Urdu = "ur"+ show Uzbek = "uz"+ show Vietnamese = "vi"+ show Welsh = "cy"+ show Yiddish = "yi"+ show Yoruba = "yo"+ show Zulu = "zu"+------------------------------------------------------------------------------+-- | Languages for translation+data Lang =+ Afrikaans+ | Albanian+ | Arabic+ | Armenian+ | Azerbaijani+ | Basque+ | Belarusian+ | Bengali+ | Bosnian+ | Bulgarian+ | Catalan+ | Cebuano+ | Chichewa+ | ChineseSimplified+ | ChineseTraditional+ | Croatian+ | Czech+ | Danish+ | Dutch+ | English+ | Esperanto+ | Estonian+ | Filipino+ | Finnish+ | French+ | Galician+ | Georgian+ | German+ | Greek+ | Gujarati+ | HaitianCreole+ | Hausa+ | Hebrew+ | Hindi+ | Hmong+ | Hungarian+ | Icelandic+ | Igbo+ | Indonesian+ | Irish+ | Italian+ | Japanese+ | Javanese+ | Kannada+ | Kazakh+ | Khmer+ | Korean+ | Lao+ | Latin+ | Latvian+ | Lithuanian+ | Macedonian+ | Malagasy+ | Malay+ | Malayalam+ | Maltese+ | Maori+ | Marathi+ | Mongolian+ | MyanmarBurmese+ | Nepali+ | Norwegian+ | Persian+ | Polish+ | Portuguese+ | Punjabi+ | Romanian+ | Russian+ | Serbian+ | Sesotho+ | Sinhala+ | Slovak+ | Slovenian+ | Somali+ | Spanish+ | Sundanese+ | Swahili+ | Swedish+ | Tajik+ | Tamil+ | Telugu+ | Thai+ | Turkish+ | Ukrainian+ | Urdu+ | Uzbek+ | Vietnamese+ | Welsh+ | Yiddish+ | Yoruba+ | Zulu+ deriving (Eq, Ord)+------------------------------------------------------------------------------+instance ToText Lang where toText = toTxt+------------------------------------------------------------------------------+instance FromText Lang where+ fromText txt =+ case fromJSON (String txt) of+ Success x -> Just x+ _ -> Nothing+------------------------------------------------------------------------------+instance FromJSON Lang where+ parseJSON (String "af") = pure Afrikaans+ parseJSON (String "sq") = pure Albanian+ parseJSON (String "ar") = pure Arabic+ parseJSON (String "hy") = pure Armenian+ parseJSON (String "az") = pure Azerbaijani+ parseJSON (String "eu") = pure Basque+ parseJSON (String "be") = pure Belarusian+ parseJSON (String "bn") = pure Bengali+ parseJSON (String "bs") = pure Bosnian+ parseJSON (String "bg") = pure Bulgarian+ parseJSON (String "ca") = pure Catalan+ parseJSON (String "ceb") = pure Cebuano+ parseJSON (String "ny") = pure Chichewa+ parseJSON (String "zh") = pure ChineseSimplified+ parseJSON (String "zh-TW") = pure ChineseTraditional+ parseJSON (String "hr") = pure Croatian+ parseJSON (String "cs") = pure Czech+ parseJSON (String "da") = pure Danish+ parseJSON (String "nl") = pure Dutch+ parseJSON (String "en") = pure English+ parseJSON (String "eo") = pure Esperanto+ parseJSON (String "et") = pure Estonian+ parseJSON (String "tl") = pure Filipino+ parseJSON (String "fi") = pure Finnish+ parseJSON (String "fr") = pure French+ parseJSON (String "gl") = pure Galician+ parseJSON (String "ka") = pure Georgian+ parseJSON (String "de") = pure German+ parseJSON (String "el") = pure Greek+ parseJSON (String "gu") = pure Gujarati+ parseJSON (String "ht") = pure HaitianCreole+ parseJSON (String "ha") = pure Hausa+ parseJSON (String "iw") = pure Hebrew+ parseJSON (String "hi") = pure Hindi+ parseJSON (String "hmn") = pure Hmong+ parseJSON (String "hu") = pure Hungarian+ parseJSON (String "is") = pure Icelandic+ parseJSON (String "ig") = pure Igbo+ parseJSON (String "id") = pure Indonesian+ parseJSON (String "ga") = pure Irish+ parseJSON (String "it") = pure Italian+ parseJSON (String "ja") = pure Japanese+ parseJSON (String "jw") = pure Javanese+ parseJSON (String "kn") = pure Kannada+ parseJSON (String "kk") = pure Kazakh+ parseJSON (String "km") = pure Khmer+ parseJSON (String "ko") = pure Korean+ parseJSON (String "lo") = pure Lao+ parseJSON (String "la") = pure Latin+ parseJSON (String "lv") = pure Latvian+ parseJSON (String "lt") = pure Lithuanian+ parseJSON (String "mk") = pure Macedonian+ parseJSON (String "mg") = pure Malagasy+ parseJSON (String "ms") = pure Malay+ parseJSON (String "ml") = pure Malayalam+ parseJSON (String "mt") = pure Maltese+ parseJSON (String "mi") = pure Maori+ parseJSON (String "mr") = pure Marathi+ parseJSON (String "mn") = pure Mongolian+ parseJSON (String "my") = pure MyanmarBurmese+ parseJSON (String "ne") = pure Nepali+ parseJSON (String "no") = pure Norwegian+ parseJSON (String "fa") = pure Persian+ parseJSON (String "pl") = pure Polish+ parseJSON (String "pt") = pure Portuguese+ parseJSON (String "pa") = pure Punjabi+ parseJSON (String "ro") = pure Romanian+ parseJSON (String "ru") = pure Russian+ parseJSON (String "sr") = pure Serbian+ parseJSON (String "st") = pure Sesotho+ parseJSON (String "si") = pure Sinhala+ parseJSON (String "sk") = pure Slovak+ parseJSON (String "sl") = pure Slovenian+ parseJSON (String "so") = pure Somali+ parseJSON (String "es") = pure Spanish+ parseJSON (String "su") = pure Sundanese+ parseJSON (String "sw") = pure Swahili+ parseJSON (String "sv") = pure Swedish+ parseJSON (String "tg") = pure Tajik+ parseJSON (String "ta") = pure Tamil+ parseJSON (String "te") = pure Telugu+ parseJSON (String "th") = pure Thai+ parseJSON (String "tr") = pure Turkish+ parseJSON (String "uk") = pure Ukrainian+ parseJSON (String "ur") = pure Urdu+ parseJSON (String "uz") = pure Uzbek+ parseJSON (String "vi") = pure Vietnamese+ parseJSON (String "cy") = pure Welsh+ parseJSON (String "yi") = pure Yiddish+ parseJSON (String "yo") = pure Yoruba+ parseJSON (String "zu") = pure Zulu+------------------------------------------------------------------------------+instance ToJSON Lang where+ toJSON = String . toTxt++