keera-posture-0.1.4.4: src/Controller/Conditions/LanguageConfig.hs
-- | Reads/Writes the language in a configuration file.
module Controller.Conditions.LanguageConfig (installHandlers) where
import qualified Control.Exception as E
import Control.Exception.Extra
import Control.Monad
import System.FilePath
import System.Directory
import CombinedEnvironment
import Model.Model (Language(..))
import Hails.MVC.Model.ProtectedModel.Reactive
-- | Reads the language config on startup and saves it when modified.
installHandlers :: CEnv -> IO()
installHandlers cenv = do
let pm = model cenv
onEvent pm Initialised $ conditionRead cenv
onEvent pm LanguageChanged $ conditionSave cenv
-- | Saves the currently selected language ID String in a configuration file
conditionSave :: CEnv -> IO ()
conditionSave cenv = onViewAsync $ void $ handleAllExceptions (return ()) $ do -- E.handle (anyway (return ())) $ do
-- Directory and file where results will be saved
dir <- getAppUserDataDirectory "keera-posture"
createDirectoryIfMissing True dir
let file = dir </> "default-language"
-- Get cur language from the model
let pm = model cenv
language <- getter languageField pm
-- Save
writeFile file $ languageToLanguageString language
-- | Reads the currently selected language ID String from a configuration file
conditionRead :: CEnv -> IO ()
conditionRead cenv = onViewAsync $ void $ handleAllExceptions (return ()) $ do -- E.handle (anyway (return ())) $ do
-- Directory and file where results will be read
dir <- getAppUserDataDirectory "keera-posture"
let file = dir </> "default-language"
-- Read the language string
lang <- E.handle (anyway (return "")) $ do
cs <- fmap lines $ readFile file
return $ if null cs then "" else head cs
let language = languageStringToLanguage lang
-- Update the model
let pm = model cenv
setter languageField pm language
-- | Determines the language based on the language string
languageStringToLanguage :: String -> Maybe Language
languageStringToLanguage "en" = Just English
languageStringToLanguage "es" = Just Spanish
languageStringToLanguage "gl" = Just Galician
languageStringToLanguage _ = Nothing
-- | Determines the language string id based on the language
languageToLanguageString :: Maybe Language -> String
languageToLanguageString (Just English) = "en"
languageToLanguageString (Just Galician) = "gl"
languageToLanguageString (Just Spanish) = "es"
languageToLanguageString _ = ""