aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/Model/Translations.elm
blob: dbf378c13499a3c59fe70143e3112e32427020e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
module Model.Translations
  ( translationsDecoder
  , Translations
  , Translation
  , getMessage
  , getParamMessage
  ) where

import Maybe exposing (withDefault)
import Json.Decode as Json exposing ((:=))
import String

type alias Translations = List Translation

translationsDecoder : Json.Decoder Translations
translationsDecoder = Json.list translationDecoder

type alias Translation =
  { key : String
  , message : List MessagePart
  }

getTranslation : String -> Translations -> Maybe (List MessagePart)
getTranslation key translations =
  translations
    |> List.filter (\translation -> translation.key == key)
    |> List.head
    |> Maybe.map .message

translationDecoder : Json.Decoder Translation
translationDecoder =
  Json.object2 Translation
    ("key" := Json.string)
    ("message" := Json.list partDecoder)

type MessagePart =
  Order Int
  | Str String

partDecoder : Json.Decoder MessagePart
partDecoder =
  ("tag" := Json.string) `Json.andThen` partDecoderWithTag

partDecoderWithTag : String -> Json.Decoder MessagePart
partDecoderWithTag tag =
  case tag of
    "Order" -> Json.object1 Order ("contents" := Json.int)
    _ -> Json.object1 Str ("contents" := Json.string)

-----

getMessage : String -> Translations -> String
getMessage = getParamMessage []

getParamMessage : List String -> String -> Translations -> String
getParamMessage values key translations =
  getTranslation key translations
    |> Maybe.map (\parts -> String.concat (List.map (replacePart values) parts))
    |> withDefault key

replacePart : List String -> MessagePart -> String
replacePart values part =
  case part of
    Str str -> str
    Order n ->
      values
        |> List.drop (n - 1)
        |> List.head
        |> withDefault ("{" ++ (toString n) ++ "}")