module Network.URI.Locale(rfc2616Locale) where import System.Environment (lookupEnv) import Control.Monad (forM) import Data.Maybe (mapMaybe) import Data.Char (toLower) --- This file is based on logic in GNOME's LibSoup & GLib. rfc2616Locale :: IO [String] rfc2616Locale = do locales <- forM ["LANGUAGE", "LC_ALL", "LC_MESSAGES", "LANG"] lookupEnv return $ mapMaybe toRFC2616Lang $ split ':' $ firstJust locales "en_US" toRFC2616Lang "C" = Nothing toRFC2616Lang ('C':'.':_) = Nothing toRFC2616Lang ('C':'@':_) = Nothing toRFC2616Lang lang = case toRFC2616Lang' lang of "" -> Nothing lang' -> Just lang' toRFC2616Lang' ('_':cs) = '-' : toRFC2616Lang' cs toRFC2616Lang' ('.':_) = [] toRFC2616Lang' ('@':_) = [] toRFC2616Lang' (c:cs) = toLower c : toRFC2616Lang' cs toRFC2616Lang' [] = [] firstJust (Just a:_) _ | a /= "" = a firstJust (_:maybes) fallback = firstJust maybes fallback firstJust [] fallback = fallback split b (a:as) | a == b = [] : split b as | (head':tail') <- split b as = (a:head') : tail' split _ [] = [[]]