diff options
Diffstat (limited to 'src/Localize.hsc')
-rw-r--r-- | src/Localize.hsc | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/Localize.hsc b/src/Localize.hsc new file mode 100644 index 0000000..bfaa6f0 --- /dev/null +++ b/src/Localize.hsc @@ -0,0 +1,98 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +----------------------------------------------------------------------------- +-- | +-- Module : Localize +-- Copyright : (C) 2011 Martin Perner +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Martin Perner <martin@perner.cc> +-- Stability : unstable +-- Portability : unportable +-- +-- This module provides an interface to locale information e.g. for DateL +-- +----------------------------------------------------------------------------- + +module Localize + ( setupTimeLocale, + getTimeLocale + ) where + +import Foreign +import Foreign.C +import qualified System.Locale as L + +#ifdef UTF8 +import Codec.Binary.UTF8.String +#endif + +-- get localized strings +type NlItem = CInt + +#include <langinfo.h> +foreign import ccall unsafe "langinfo.h nl_langinfo" + nl_langinfo :: NlItem -> IO CString + +#{enum NlItem, + , AM_STR , PM_STR \ + , D_T_FMT , D_FMT , T_FMT , T_FMT_AMPM \ + , ABDAY_1 , ABDAY_2 , ABDAY_3 , ABDAY_4 , ABDAY_5 , ABDAY_6 , ABDAY_7 \ + , DAY_1 , DAY_2 , DAY_3 , DAY_4 , DAY_5 , DAY_6 , DAY_7 \ + , ABMON_1 , ABMON_2 , ABMON_3 , ABMON_4 , ABMON_5 , ABMON_6 , ABMON_7 \ + , ABMON_8 , ABMON_9 , ABMON_10 , ABMON_11 , ABMON_12 \ + , MON_1 , MON_2 , MON_3 , MON_4 , MON_5 , MON_6 , MON_7 , MON_8 , MON_9 \ + , MON_10 , MON_11 , MON_12\ + } + +#let LIST_CTR fst,snd,idx = "( getLangInfo "fst""idx" , getLangInfo "snd""idx" )" + +getLangInfo :: NlItem -> String +#ifdef UTF8 +getLangInfo item = decodeString $ unsafePerformIO $ getLangInfo' item +#else +getLangInfo item = unsafePerformIO $ getLangInfo' item +#endif + +getLangInfo' :: NlItem -> IO String +getLangInfo' item = do + itemStr <- nl_langinfo item + peekCString itemStr + +#include <locale.h> +foreign import ccall unsafe "locale.h setlocale" + setlocale :: CInt -> CString -> IO CString + +setupTimeLocale :: String -> IO () +setupTimeLocale l = withCString l (setlocale #const LC_TIME) >> return () + +getTimeLocale :: L.TimeLocale +getTimeLocale = L.TimeLocale { + L.wDays = [ #{LIST_CTR "day","abday","1"} + , #{LIST_CTR "day","abday","2"} + , #{LIST_CTR "day","abday","3"} + , #{LIST_CTR "day","abday","4"} + , #{LIST_CTR "day","abday","5"} + , #{LIST_CTR "day","abday","6"} + , #{LIST_CTR "day","abday","7"} + ], + L.months = [ #{LIST_CTR "mon","abmon","1"} + , #{LIST_CTR "mon","abmon","2"} + , #{LIST_CTR "mon","abmon","3"} + , #{LIST_CTR "mon","abmon","4"} + , #{LIST_CTR "mon","abmon","5"} + , #{LIST_CTR "mon","abmon","6"} + , #{LIST_CTR "mon","abmon","7"} + , #{LIST_CTR "mon","abmon","8"} + , #{LIST_CTR "mon","abmon","9"} + , #{LIST_CTR "mon","abmon","10"} + , #{LIST_CTR "mon","abmon","11"} + , #{LIST_CTR "mon","abmon","12"} + ], + -- Intervals are not available from this interface + L.intervals = L.intervals L.defaultTimeLocale, + L.amPm = (getLangInfo amStr, getLangInfo pmStr), + L.dateTimeFmt = getLangInfo dTFmt, + L.dateFmt = getLangInfo dFmt, + L.timeFmt = getLangInfo tFmt, + L.time12Fmt = getLangInfo tFmtAmpm + } |