EngageSoftware / elm-dnn-localization / Engage.Localization

Helpers for working with DNN Localization for Engage Software team.

Types


type alias Localization =
Dict String String

Dict for storing localized text

Create Localization Dict

decoder : Json.Decode.Decoder Localization

Decode from JSON values to a Localization.

Supports three formats:

    import Dict
    import Engage.Localization exposing (Localization)
    import Json.Decode as Decode
    import Result

    type alias Model =
        { localization : Localization
        }

    """ [ { "key": "FirstName.Text", "value": "First Name:" } ] """
        |> Decode.decodeString decoder
        |> Result.withDefault Dict.empty
        |> Model
        |> localizeString "FirstName"
    --> "First Name:"

    """ [ { "Key": "LastName.Text", "Value": "Last Name:" } ] """
        |> Decode.decodeString decoder
        |> Result.withDefault Dict.empty
        |> Model
        |> localizeString "lastname"
    --> "Last Name:"

    """ { "FirstName.Text": "Given Name", "FirstName.Help": "Your given name" } """
        |> Decode.decodeString decoder
        |> Result.withDefault Dict.empty
        |> Model
        |> localizeString "FirstName.Help"
    --> "Your given name"

fromDict : Dict String String -> Localization

Convert a dictionary to a Localization.

This normalizes the data in the dictionary (i.e. it is not the same as just using a Dict String String directly).

import Dict
import Engage.Localization as Localization

type alias Model =
    { localization : Localization
    }

Dict.fromList [ ("FirstName.Text", "First Name:") ]
    |> Localization.fromDict
    |> Model
    |> Localization.localizeString "FirstName"
--> "First Name:"

empty : Localization

Creates an empty Localization.

import Engage.Localization as Localization

type alias Model =
    { localization : Localization
    }

initialModel : Model
initialModel =
    Model Localization.empty

initialModel
    |> Localization.localizeString "FirstName"
--> "[FirstName]"

Get localized values

localizeString : String -> { a | localization : Localization } -> String

Localize a key using the given Localization dict.

If the key is not found, this function will return the key value wrapped in [ ]. The key is searched in a case-insensitive manner. Keys which end in .Text may omit that suffix.

import Dict
import Engage.Localization as Localization exposing (Localization)

myLocalization : Localization
myLocalization = Dict.fromList [ ("FirstName.Text", "First Name: ") ] |> Localization.fromDict

localizeString "FirstName" { localization = myLocalization }
--> "First Name: "

localizeString "LastName" { localization = myLocalization }
--> "[LastName]"

localizeStringWithDefault : String -> String -> { a | localization : Localization } -> String

Try to localize a key using the given Localization dict, and if the key is not found, return the given default value.

The key is searched in a case-insensitive manner. Keys which end in .Text may omit that suffix.

import Dict
import Engage.Localization as Localization exposing (Localization)

myLocalization : Localization
myLocalization = Dict.fromList [ ("FirstName.Text", "First Name: ") ] |> Localization.fromDict

localizeStringWithDefault "First Name" "FirstName.Text" { localization = myLocalization }
--> "First Name: "
localizeStringWithDefault "Last Name" "LastName.Text" { localization = myLocalization }
--> "Last Name"

localizeText : String -> { a | localization : Localization } -> Html msg

Similar to localizeText, but with the text wrapped in Html.text

import Dict
import Engage.Localization as Localization exposing (Localization)
import Html

myLocalization : Localization
myLocalization = Dict.fromList [ ("FirstName.Text", "First Name: ") ] |> Localization.fromDict

localizeText "FirstName.Text" { localization = myLocalization }
--> Html.text "First Name: "
localizeText "LastName.Text" { localization = myLocalization }
--> Html.text "[LastName.Text]"

localizeTextWithDefault : String -> String -> { a | localization : Localization } -> Html msg

Similar to localizeTextWithDefault, but with the text wrapped in Html.text

import Dict
import Engage.Localization as Localization exposing (Localization)
import Html

myLocalization : Localization
myLocalization = Dict.fromList [ ("FirstName.Text", "First Name: ") ] |> Localization.fromDict

localizeTextWithDefault "First Name" "FirstName.Text" { localization = myLocalization }
--> Html.text "First Name: "
localizeTextWithDefault "Last Name" "LastName.Text" { localization = myLocalization }
--> Html.text "Last Name"