{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, ExistentialQuantification, DeriveDataTypeable #-}
module Text.Localize
(
__, __n, __f,
translate, translateN, translateNFormat,
lookup, withTranslation,
module Text.Localize.Types,
module Text.Localize.Load,
module Text.Localize.Locale
) where
import Prelude hiding (lookup)
import Control.Applicative
import Control.Monad
import qualified Data.Map as M
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.Encoding as TLE
import qualified Data.Text.Encoding as TE
import Data.String
import Data.List hiding (lookup)
import Data.Monoid
import Data.Typeable
import qualified Data.Gettext as Gettext
import qualified Data.Text.Format.Heavy as F
import Data.Text.Format.Heavy.Parse (parseFormat)
import Text.Localize.Types
import Text.Localize.Load
import Text.Localize.Locale
lookup :: Translations -> LanguageId -> TranslationSource -> T.Text
lookup :: Translations -> LanguageId -> TranslationSource -> Text
lookup Translations
t LanguageId
lang TranslationSource
bstr =
case LanguageId -> Map LanguageId Catalog -> Maybe Catalog
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup LanguageId
lang (Translations -> Map LanguageId Catalog
tMap Translations
t) of
Maybe Catalog
Nothing -> TranslationSource -> Text
toText TranslationSource
bstr
Just Catalog
gmo -> Catalog -> TranslationSource -> Text
Gettext.gettext Catalog
gmo TranslationSource
bstr
withTranslation :: Localized m
=> (b -> r)
-> (Gettext.Catalog -> Maybe Context -> b -> r)
-> (b -> m r)
withTranslation :: (b -> r)
-> (Catalog -> Maybe TranslationSource -> b -> r) -> b -> m r
withTranslation b -> r
dflt Catalog -> Maybe TranslationSource -> b -> r
fn b
b = do
Translations
t <- m Translations
forall (m :: * -> *). Localized m => m Translations
getTranslations
LanguageId
lang <- m LanguageId
forall (m :: * -> *). Localized m => m LanguageId
getLanguage
Maybe TranslationSource
ctxt <- m (Maybe TranslationSource)
forall (m :: * -> *). Localized m => m (Maybe TranslationSource)
getContext
case LanguageId -> Map LanguageId Catalog -> Maybe Catalog
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup LanguageId
lang (Translations -> Map LanguageId Catalog
tMap Translations
t) of
Maybe Catalog
Nothing -> r -> m r
forall (m :: * -> *) a. Monad m => a -> m a
return (r -> m r) -> r -> m r
forall a b. (a -> b) -> a -> b
$ b -> r
dflt b
b
Just Catalog
gmo -> r -> m r
forall (m :: * -> *) a. Monad m => a -> m a
return (r -> m r) -> r -> m r
forall a b. (a -> b) -> a -> b
$ Catalog -> Maybe TranslationSource -> b -> r
fn Catalog
gmo Maybe TranslationSource
ctxt b
b
translate :: (Localized m) => TranslationSource -> m T.Text
translate :: TranslationSource -> m Text
translate TranslationSource
orig = do
Translations
t <- m Translations
forall (m :: * -> *). Localized m => m Translations
getTranslations
LanguageId
lang <- m LanguageId
forall (m :: * -> *). Localized m => m LanguageId
getLanguage
Maybe TranslationSource
mbContext <- m (Maybe TranslationSource)
forall (m :: * -> *). Localized m => m (Maybe TranslationSource)
getContext
case LanguageId -> Map LanguageId Catalog -> Maybe Catalog
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup LanguageId
lang (Translations -> Map LanguageId Catalog
tMap Translations
t) of
Maybe Catalog
Nothing -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ TranslationSource -> Text
toText TranslationSource
orig
Just Catalog
gmo ->
case Maybe TranslationSource
mbContext of
Maybe TranslationSource
Nothing -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ Catalog -> TranslationSource -> Text
Gettext.gettext Catalog
gmo TranslationSource
orig
Just TranslationSource
ctxt -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ Catalog -> TranslationSource -> TranslationSource -> Text
Gettext.cgettext Catalog
gmo TranslationSource
ctxt TranslationSource
orig
__ :: (Localized m) => TranslationSource -> m T.Text
__ :: TranslationSource -> m Text
__ = TranslationSource -> m Text
forall (m :: * -> *). Localized m => TranslationSource -> m Text
translate
translateN :: (Localized m)
=> TranslationSource
-> TranslationSource
-> Int
-> m T.Text
translateN :: TranslationSource -> TranslationSource -> Int -> m Text
translateN TranslationSource
orig TranslationSource
plural Int
n = do
Translations
t <- m Translations
forall (m :: * -> *). Localized m => m Translations
getTranslations
LanguageId
lang <- m LanguageId
forall (m :: * -> *). Localized m => m LanguageId
getLanguage
Maybe TranslationSource
mbContext <- m (Maybe TranslationSource)
forall (m :: * -> *). Localized m => m (Maybe TranslationSource)
getContext
case LanguageId -> Map LanguageId Catalog -> Maybe Catalog
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup LanguageId
lang (Translations -> Map LanguageId Catalog
tMap Translations
t) of
Maybe Catalog
Nothing -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ TranslationSource -> Text
toText TranslationSource
orig
Just Catalog
gmo ->
case Maybe TranslationSource
mbContext of
Maybe TranslationSource
Nothing -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ Catalog -> TranslationSource -> TranslationSource -> Int -> Text
Gettext.ngettext Catalog
gmo TranslationSource
orig TranslationSource
plural Int
n
Just TranslationSource
ctxt -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ Catalog
-> TranslationSource
-> TranslationSource
-> TranslationSource
-> Int
-> Text
Gettext.cngettext Catalog
gmo TranslationSource
ctxt TranslationSource
orig TranslationSource
plural Int
n
translateFormat :: (Localized m, MonadFail m, F.VarContainer vars)
=> TranslationSource
-> vars
-> m T.Text
translateFormat :: TranslationSource -> vars -> m Text
translateFormat TranslationSource
orig vars
vars = do
Text
fmtStr <- TranslationSource -> m Text
forall (m :: * -> *). Localized m => TranslationSource -> m Text
translate TranslationSource
orig
case Text -> Either ParseError Format
parseFormat Text
fmtStr of
Left ParseError
err -> LanguageId -> m Text
forall (m :: * -> *) a. MonadFail m => LanguageId -> m a
fail (LanguageId -> m Text) -> LanguageId -> m Text
forall a b. (a -> b) -> a -> b
$ ParseError -> LanguageId
forall a. Show a => a -> LanguageId
show ParseError
err
Right Format
fmt -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ Format -> vars -> Text
forall vars. VarContainer vars => Format -> vars -> Text
F.format Format
fmt vars
vars
__f :: (Localized m, MonadFail m, F.VarContainer c) => TranslationSource -> c -> m T.Text
__f :: TranslationSource -> c -> m Text
__f = TranslationSource -> c -> m Text
forall (m :: * -> *) vars.
(Localized m, MonadFail m, VarContainer vars) =>
TranslationSource -> vars -> m Text
translateFormat
translateNFormat :: (Localized m, MonadFail m, F.VarContainer vars)
=> TranslationSource
-> TranslationSource
-> Int
-> vars
-> m T.Text
translateNFormat :: TranslationSource -> TranslationSource -> Int -> vars -> m Text
translateNFormat TranslationSource
orig TranslationSource
plural Int
n vars
vars = do
Text
fmtStr <- TranslationSource -> TranslationSource -> Int -> m Text
forall (m :: * -> *).
Localized m =>
TranslationSource -> TranslationSource -> Int -> m Text
translateN TranslationSource
orig TranslationSource
plural Int
n
case Text -> Either ParseError Format
parseFormat Text
fmtStr of
Left ParseError
err -> LanguageId -> m Text
forall (m :: * -> *) a. MonadFail m => LanguageId -> m a
fail (LanguageId -> m Text) -> LanguageId -> m Text
forall a b. (a -> b) -> a -> b
$ ParseError -> LanguageId
forall a. Show a => a -> LanguageId
show ParseError
err
Right Format
fmt -> Text -> m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> m Text) -> Text -> m Text
forall a b. (a -> b) -> a -> b
$ Format -> vars -> Text
forall vars. VarContainer vars => Format -> vars -> Text
F.format Format
fmt vars
vars
__n :: (Localized m, MonadFail m, F.VarContainer c) => TranslationSource -> TranslationSource -> Int -> c -> m T.Text
__n :: TranslationSource -> TranslationSource -> Int -> c -> m Text
__n = TranslationSource -> TranslationSource -> Int -> c -> m Text
forall (m :: * -> *) vars.
(Localized m, MonadFail m, VarContainer vars) =>
TranslationSource -> TranslationSource -> Int -> vars -> m Text
translateNFormat