aboutsummaryrefslogtreecommitdiff
path: root/src/client/Model/Translations.elm
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/Model/Translations.elm')
-rw-r--r--src/client/Model/Translations.elm68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/client/Model/Translations.elm b/src/client/Model/Translations.elm
new file mode 100644
index 0000000..9b314e1
--- /dev/null
+++ b/src/client/Model/Translations.elm
@@ -0,0 +1,68 @@
+module Model.Translations exposing
+ ( translationsDecoder
+ , Translations
+ , Translation
+ , getMessage
+ , getParamMessage
+ )
+
+import Maybe exposing (withDefault)
+import Json.Decode as Decode exposing (Decoder)
+import String
+
+type alias Translations = List Translation
+
+translationsDecoder : Decoder Translations
+translationsDecoder = Decode.list translationDecoder
+
+type alias Translation =
+ { key : String
+ , message : List MessagePart
+ }
+
+getTranslation : String -> Translations -> Maybe (List MessagePart)
+getTranslation key translations =
+ translations
+ |> List.filter (\translation -> String.toLower translation.key == String.toLower key)
+ |> List.head
+ |> Maybe.map .message
+
+translationDecoder : Decoder Translation
+translationDecoder =
+ Decode.map2 Translation
+ (Decode.field "key" Decode.string)
+ (Decode.field "message" (Decode.list partDecoder))
+
+type MessagePart =
+ Order Int
+ | Str String
+
+partDecoder : Decoder MessagePart
+partDecoder = (Decode.field "tag" Decode.string) |> Decode.andThen partDecoderWithTag
+
+partDecoderWithTag : String -> Decoder MessagePart
+partDecoderWithTag tag =
+ case tag of
+ "Order" -> Decode.map Order (Decode.field "contents" Decode.int)
+ _ -> Decode.map Str (Decode.field "contents" Decode.string)
+
+-----
+
+getMessage : Translations -> String -> String
+getMessage = getParamMessage []
+
+getParamMessage : List String -> Translations -> String -> String
+getParamMessage values translations key =
+ 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) ++ "}")