module Text.I18N.GetText (
getText,
nGetText,
dGetText,
dnGetText,
dcGetText,
dcnGetText,
bindTextDomain,
textDomain
) where
import Data.Maybe (fromMaybe)
import Foreign.C.Error
import Foreign.C.String
import Foreign.C.Types
import Foreign.Ptr
import System.Locale.SetLocale
foreign import ccall unsafe "libintl.h gettext" c_gettext
:: CString -> IO CString
foreign import ccall unsafe "libintl.h dgettext" c_dgettext
:: CString -> CString -> IO CString
foreign import ccall unsafe "libintl.h dcgettext" c_dcgettext
:: CString -> CString -> CInt -> IO CString
foreign import ccall unsafe "libintl.h ngettext" c_ngettext
:: CString -> CString -> CULong -> IO CString
foreign import ccall unsafe "libintl.h dngettext" c_dngettext
:: CString -> CString -> CString -> CULong -> IO CString
foreign import ccall unsafe "libintl.h dcngettext" c_dcngettext
:: CString -> CString -> CString -> CULong -> CInt -> IO CString
foreign import ccall unsafe "libintl.h bindtextdomain" c_bindtextdomain
:: CString -> CString -> IO CString
foreign import ccall unsafe "libintl.h textdomain" c_textdomain
:: CString -> IO CString
fromCString :: CString -> IO (Maybe String)
fromCString :: CString -> IO (Maybe String)
fromCString CString
x | CString
x forall a. Eq a => a -> a -> Bool
== forall a. Ptr a
nullPtr = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
| Bool
otherwise = CString -> IO String
peekCString CString
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just
fromCStringError :: String -> CString -> IO String
fromCStringError :: String -> CString -> IO String
fromCStringError String
err CString
x | CString
x forall a. Eq a => a -> a -> Bool
== forall a. Ptr a
nullPtr = forall a. String -> IO a
throwErrno String
err
| Bool
otherwise = CString -> IO String
peekCString CString
x
fromCStringDefault :: String -> CString -> IO String
fromCStringDefault :: String -> CString -> IO String
fromCStringDefault String
d CString
x = CString -> IO (Maybe String)
fromCString CString
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Maybe String
r -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a -> a
fromMaybe String
d Maybe String
r)
fromCStringPluralDefault :: (Eq a, Num a) => String -> String -> a -> CString -> IO String
fromCStringPluralDefault :: forall a.
(Eq a, Num a) =>
String -> String -> a -> CString -> IO String
fromCStringPluralDefault String
def String
def_plural a
n CString
s
| a
n forall a. Eq a => a -> a -> Bool
== a
1 = String -> CString -> IO String
fromCStringDefault String
def CString
s
| Bool
otherwise = String -> CString -> IO String
fromCStringDefault String
def_plural CString
s
withCStringMaybe :: Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe :: forall a. Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe Maybe String
Nothing CString -> IO a
f = CString -> IO a
f forall a. Ptr a
nullPtr
withCStringMaybe (Just String
str) CString -> IO a
f = forall a. String -> (CString -> IO a) -> IO a
withCString String
str CString -> IO a
f
getText :: String -> IO String
getText :: String -> IO String
getText String
s =
forall a. String -> (CString -> IO a) -> IO a
withCString String
s forall a b. (a -> b) -> a -> b
$ \CString
s' ->
CString -> IO CString
c_gettext CString
s' forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> CString -> IO String
fromCStringDefault String
s
dGetText :: Maybe String
-> String
-> IO String
dGetText :: Maybe String -> String -> IO String
dGetText Maybe String
domainname String
msgid =
forall a. Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe Maybe String
domainname forall a b. (a -> b) -> a -> b
$ \CString
dn' ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid forall a b. (a -> b) -> a -> b
$ \CString
msg' ->
CString -> CString -> IO CString
c_dgettext CString
dn' CString
msg' forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> CString -> IO String
fromCStringDefault String
msgid
dcGetText :: Maybe String
-> Category
-> String
-> IO String
dcGetText :: Maybe String -> Category -> String -> IO String
dcGetText Maybe String
domainname Category
cat String
msgid =
forall a. Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe Maybe String
domainname forall a b. (a -> b) -> a -> b
$ \CString
dn' ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid forall a b. (a -> b) -> a -> b
$ \CString
msg' ->
CString -> CString -> CInt -> IO CString
c_dcgettext CString
dn' CString
msg' (Category -> CInt
categoryToCInt Category
cat) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
String -> CString -> IO String
fromCStringDefault String
msgid
nGetText :: String
-> String
-> Integer
-> IO String
nGetText :: String -> String -> Integer -> IO String
nGetText String
msgid String
msgid_plural Integer
n =
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid forall a b. (a -> b) -> a -> b
$ \CString
msgid' ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid_plural forall a b. (a -> b) -> a -> b
$ \CString
msgid_plural' ->
CString -> CString -> CULong -> IO CString
c_ngettext CString
msgid' CString
msgid_plural' (forall a. Num a => Integer -> a
fromInteger Integer
n) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
forall a.
(Eq a, Num a) =>
String -> String -> a -> CString -> IO String
fromCStringPluralDefault String
msgid String
msgid_plural Integer
n
dnGetText :: Maybe String
-> String
-> String
-> Integer
-> IO String
dnGetText :: Maybe String -> String -> String -> Integer -> IO String
dnGetText Maybe String
domainname String
msgid String
msgid_plural Integer
n =
forall a. Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe Maybe String
domainname forall a b. (a -> b) -> a -> b
$ \CString
dn' ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid forall a b. (a -> b) -> a -> b
$ \CString
msgid' ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid_plural forall a b. (a -> b) -> a -> b
$ \CString
msgid_plural' ->
CString -> CString -> CString -> CULong -> IO CString
c_dngettext CString
dn' CString
msgid' CString
msgid_plural' (forall a. Num a => Integer -> a
fromInteger Integer
n) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
forall a.
(Eq a, Num a) =>
String -> String -> a -> CString -> IO String
fromCStringPluralDefault String
msgid String
msgid_plural Integer
n
dcnGetText :: Maybe String
-> Category
-> String
-> String
-> Integer
-> IO String
dcnGetText :: Maybe String
-> Category -> String -> String -> Integer -> IO String
dcnGetText Maybe String
domainname Category
cat String
msgid String
msgid_plural Integer
n =
forall a. Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe Maybe String
domainname forall a b. (a -> b) -> a -> b
$ \CString
dn' ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid forall a b. (a -> b) -> a -> b
$ \CString
msgid' ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
msgid_plural forall a b. (a -> b) -> a -> b
$ \CString
msgid_plural' ->
CString -> CString -> CString -> CULong -> CInt -> IO CString
c_dcngettext CString
dn' CString
msgid' CString
msgid_plural'
(forall a. Num a => Integer -> a
fromInteger Integer
n) (Category -> CInt
categoryToCInt Category
cat) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
forall a.
(Eq a, Num a) =>
String -> String -> a -> CString -> IO String
fromCStringPluralDefault String
msgid String
msgid_plural Integer
n
bindTextDomain :: String
-> Maybe String
-> IO String
bindTextDomain :: String -> Maybe String -> IO String
bindTextDomain String
domainname Maybe String
dirname =
forall a. String -> (CString -> IO a) -> IO a
withCString String
domainname forall a b. (a -> b) -> a -> b
$ \CString
domain ->
forall a. Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe Maybe String
dirname forall a b. (a -> b) -> a -> b
$ \CString
dir ->
CString -> CString -> IO CString
c_bindtextdomain CString
domain CString
dir forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> CString -> IO String
fromCStringError String
"bindTextDomain fails"
textDomain :: Maybe String
-> IO String
textDomain :: Maybe String -> IO String
textDomain Maybe String
domainname =
forall a. Maybe String -> (CString -> IO a) -> IO a
withCStringMaybe Maybe String
domainname forall a b. (a -> b) -> a -> b
$ \CString
domain ->
CString -> IO CString
c_textdomain CString
domain forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> CString -> IO String
fromCStringError String
"textDomain fails"