diff --git a/Yesod/Definitions.hs b/Yesod/Definitions.hs index 554eb183..df82af52 100644 --- a/Yesod/Definitions.hs +++ b/Yesod/Definitions.hs @@ -25,6 +25,7 @@ module Yesod.Definitions , authCookieName , authDisplayName , encryptedCookies + , langKey ) where import qualified Hack @@ -79,3 +80,6 @@ authDisplayName = "DISPLAY_NAME" encryptedCookies :: [String] encryptedCookies = [authDisplayName, authCookieName] + +langKey :: String +langKey = "_LANG" diff --git a/Yesod/Yesod.hs b/Yesod/Yesod.hs index 1c5af9fa..bd59f9b8 100644 --- a/Yesod/Yesod.hs +++ b/Yesod/Yesod.hs @@ -103,9 +103,14 @@ toHackApp'' y tg env = do rr = cs env res <- runHandler handler errorHandler rr y tg types let acceptLang = lookup "Accept-Language" $ Hack.http env - -- FIXME get languages from a cookie as well let langs = maybe [] parseHttpAccept acceptLang - responseToHackResponse langs res + langs' = case lookup langKey $ rawCookies rr of + Nothing -> langs + Just x -> x : langs + langs'' = case lookup langKey $ rawGetParams rr of + Nothing -> langs' + Just x -> x : langs' + responseToHackResponse langs'' res httpAccept :: Hack.Env -> [ContentType] httpAccept = map TypeOther . parseHttpAccept . fromMaybe "" diff --git a/examples/i18n.hs b/examples/i18n.hs new file mode 100644 index 00000000..1e5bc419 --- /dev/null +++ b/examples/i18n.hs @@ -0,0 +1,34 @@ +{-# LANGUAGE QuasiQuotes #-} +import Yesod +import Yesod.Constants +import Hack.Handler.SimpleServer + +data I18N = I18N + +instance Yesod I18N where + handlers = [$resources| +/: + Get: homepage +/set/$lang: + Get: setLang +|] + +homepage = return Hello + +setLang lang = do + addCookie 1 langKey lang + redirect "/" + return () + +data Hello = Hello + +instance HasReps Hello where + reps = [(TypeHtml, const $ return $ Content $ return . cs . content)] + where + content [] = "Hello" + content ("he":_) = "שלום" + content ("es":_) = "Hola" + content (_:rest) = content rest + + +main = putStrLn "Running..." >> run 3000 (toHackApp I18N)