module Happstack.Server.I18N
( acceptLanguage
, bestLanguage
) where
import Control.Arrow ((>>>), first, second)
import Data.Function (on)
import qualified Data.ByteString.Char8 as C
import Data.List (sortBy)
import Data.Maybe (fromMaybe)
import Data.Text as Text (Text, breakOnAll, pack, singleton)
import Happstack.Server.Monads (Happstack, getHeaderM)
import Happstack.Server.Internal.Compression (encodings)
import Text.ParserCombinators.Parsec (parse)
acceptLanguage :: (Happstack m) => m [(Text, Maybe Double)]
acceptLanguage =
do mAcceptLanguage <- (fmap C.unpack) <$> getHeaderM "Accept-Language"
case mAcceptLanguage of
Nothing -> return []
(Just al) ->
case parse encodings al al of
(Left _) -> return []
(Right encs) -> return (map (first Text.pack) encs)
bestLanguage :: [(Text, Maybe Double)] -> [Text]
bestLanguage range =
map (second $ fromMaybe 1) >>>
sortBy (flip compare `on` snd) >>>
filter (\(lang, q) -> lang /= (Text.singleton '*') && q > 0) >>>
concatMap (explode . fst) $
range
where
explode :: Text -> [Text]
explode lang = lang : (reverse $ map fst $ breakOnAll (singleton '-') lang)