Type-safe internationalization utilities.
$ bower install purescript-simple-i18n
$ spago install simple-i18n
You can define labels with typelevel string list for translation.
This force you to translate all labels without excess and deficiently.
NOTE: Labels should be ordered alphabetically.
import Record.Extra (type (:::), SNil)
-- Symbols should be in alphabetic order.
type Labels =
( "apple"
::: "banana"
::: "grape"
::: SNil
)
You can define translations with Simple.I18n.Translation
module.
import Simple.I18n.Translation (Translation, fromRecord)
en :: Translation Labels
en = fromRecord
{ apple: "Apple"
, banana: "Banana"
, grape: "Grape"
}
ja :: Translation Labels
ja = fromRecord
{ apple: "りんご"
, banana: "バナナ"
, grape: "ぶどう"
}
Next step is creating translator with Simple.I18n.Translator
module.
Pass fallback language and translations to createTranslator
.
import Simple.I18n.Translator (Translator, createTranslator, label, setLang, translate)
import Type.Proxy (Proxy(..))
translator :: Translator Labels
translator =
createTranslator
(Proxy :: _ "en") -- Fallback language (and default language)
{ en, ja } -- Translations
You can set language with setLang
.
import Prelude
import Simple.I18n.Translator (Translator, createTranslator, label, setLang, translate)
main :: Effect Unit
main = do
let translator' = translator # setLang "ja"
-- some codes
You might think "Why can setLang
receive String
instead of Proxy
?".
The reason is that we get language setting from outside of PureScript like navigator.language
, localStorage
, subdomain
, path
, query parameter
, or others in most cases.
So String
is enough.
You can get translation type-safely.
import Prelude
import Simple.I18n.Translator (Translator, createTranslator, label, setLang, translate)
import Type.Proxy (Proxy(..))
translator :: Translator Labels
translator =
createTranslator
(Proxy :: _ "en") -- Fallback language (and default language)
{ en, ja } -- Translations
main :: Effect Unit
main = do
log $ translator # translate (label :: _ "apple") -- "Apple"
let translator' = translator # setLang "ja"
log $ translator' # translate (label :: _ "apple") -- "りんご"
-- some codes
Module documentation is published on Pursuit.
MIT