From 5737eba82d1a0e3eb73cf0dc388e641de3749a59 Mon Sep 17 00:00:00 2001
From: Eike Kettner <eike.kettner@posteo.de>
Date: Mon, 12 Apr 2021 10:53:34 +0200
Subject: [PATCH] Prepare translating dates

---
 .../src/main/elm/Comp/AttachmentMeta.elm      |   3 +-
 .../src/main/elm/Comp/CalEventInput.elm       |   3 +-
 .../src/main/elm/Comp/CustomFieldTable.elm    |   9 +-
 .../webapp/src/main/elm/Comp/FolderTable.elm  |   9 +-
 modules/webapp/src/main/elm/Comp/ItemCard.elm |  22 +-
 .../src/main/elm/Comp/ItemDetail/EditForm.elm |   5 +-
 .../elm/Comp/ItemDetail/ItemInfoHeader.elm    |   5 +-
 .../src/main/elm/Comp/ItemDetail/View2.elm    |   4 +-
 .../webapp/src/main/elm/Comp/SentMails.elm    |  11 +-
 .../webapp/src/main/elm/Comp/UserTable.elm    |   5 +-
 .../webapp/src/main/elm/Data/ItemTemplate.elm |  92 ++--
 .../main/elm/Messages/Comp/AttachmentMeta.elm |   4 +
 .../main/elm/Messages/Comp/CalEventInput.elm  |   5 +
 .../elm/Messages/Comp/CustomFieldTable.elm    |   4 +
 .../main/elm/Messages/Comp/FolderTable.elm    |   4 +
 .../src/main/elm/Messages/Comp/ItemCard.elm   |  10 +
 .../src/main/elm/Messages/Comp/ItemDetail.elm |   4 +
 .../elm/Messages/Comp/ItemDetail/EditForm.elm |   4 +
 .../Comp/ItemDetail/ItemInfoHeader.elm        |   4 +
 .../src/main/elm/Messages/Comp/SentMails.elm  |   5 +
 .../src/main/elm/Messages/Comp/UserTable.elm  |   4 +
 .../src/main/elm/Messages/Data/Direction.elm  |  13 +
 .../src/main/elm/Messages/DateFormat.elm      | 433 ++++++++++++++++++
 .../src/main/elm/Messages/Page/Queue.elm      |   4 +
 .../webapp/src/main/elm/Page/Queue/View2.elm  |   4 +-
 modules/webapp/src/main/elm/Util/Time.elm     |  77 +---
 26 files changed, 593 insertions(+), 154 deletions(-)
 create mode 100644 modules/webapp/src/main/elm/Messages/Data/Direction.elm
 create mode 100644 modules/webapp/src/main/elm/Messages/DateFormat.elm

diff --git a/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm b/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm
index 10b9920e..8cb2b3ee 100644
--- a/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm
+++ b/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm
@@ -18,7 +18,6 @@ import Http
 import Messages.Comp.AttachmentMeta exposing (Texts)
 import Styles as S
 import Util.Http
-import Util.Time
 
 
 type alias Model =
@@ -129,7 +128,7 @@ viewProposals2 texts props =
                 [ class S.basicLabel
                 , class "text-sm"
                 ]
-                [ Util.Time.formatDateShort ms |> text
+                [ texts.formatDateShort ms |> text
                 ]
     in
     div [ class "flex flex-col" ]
diff --git a/modules/webapp/src/main/elm/Comp/CalEventInput.elm b/modules/webapp/src/main/elm/Comp/CalEventInput.elm
index a38db6be..cfbe38f0 100644
--- a/modules/webapp/src/main/elm/Comp/CalEventInput.elm
+++ b/modules/webapp/src/main/elm/Comp/CalEventInput.elm
@@ -21,7 +21,6 @@ import Messages.Comp.CalEventInput exposing (Texts)
 import Styles as S
 import Util.Http
 import Util.Maybe
-import Util.Time
 
 
 type alias Model =
@@ -284,7 +283,7 @@ view2 texts extraClasses ev model =
                 , ul [ class "list-decimal list-inside text-sm" ]
                     (Maybe.map .next model.checkResult
                         |> Maybe.withDefault []
-                        |> List.map Util.Time.formatDateTime
+                        |> List.map texts.formatDateTime
                         |> List.map (\s -> li [ class "" ] [ text s ])
                     )
                 ]
diff --git a/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm b/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm
index cb51674f..909b75b2 100644
--- a/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm
+++ b/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm
@@ -13,7 +13,6 @@ import Html exposing (..)
 import Html.Attributes exposing (..)
 import Messages.Comp.CustomFieldTable exposing (Texts)
 import Styles as S
-import Util.Time
 
 
 type alias Model =
@@ -59,13 +58,13 @@ view2 texts _ items =
                     ]
                 ]
             , tbody []
-                (List.map viewItem2 items)
+                (List.map (viewItem2 texts) items)
             ]
         ]
 
 
-viewItem2 : CustomField -> Html Msg
-viewItem2 item =
+viewItem2 : Texts -> CustomField -> Html Msg
+viewItem2 texts item =
     tr [ class S.tableRow ]
         [ B.editLinkTableCell (EditItem item)
         , td [ class "text-left py-4 md:py-2 pr-2" ]
@@ -79,7 +78,7 @@ viewItem2 item =
                 |> text
             ]
         , td [ class "text-center py-4 md:py-2 hidden sm:table-cell" ]
-            [ Util.Time.formatDateShort item.created
+            [ texts.formatDateShort item.created
                 |> text
             ]
         ]
diff --git a/modules/webapp/src/main/elm/Comp/FolderTable.elm b/modules/webapp/src/main/elm/Comp/FolderTable.elm
index f598cf71..22f49103 100644
--- a/modules/webapp/src/main/elm/Comp/FolderTable.elm
+++ b/modules/webapp/src/main/elm/Comp/FolderTable.elm
@@ -13,7 +13,6 @@ import Html exposing (..)
 import Html.Attributes exposing (..)
 import Messages.Comp.FolderTable exposing (Texts)
 import Styles as S
-import Util.Time
 
 
 type alias Model =
@@ -69,12 +68,12 @@ view2 texts _ items =
                 ]
             ]
         , tbody []
-            (List.map viewItem2 items)
+            (List.map (viewItem2 texts) items)
         ]
 
 
-viewItem2 : FolderItem -> Html Msg
-viewItem2 item =
+viewItem2 : Texts -> FolderItem -> Html Msg
+viewItem2 texts item =
     tr
         [ class S.tableRow
         ]
@@ -97,7 +96,7 @@ viewItem2 item =
                 |> text
             ]
         , td [ class "text-center  py-4 md:py-2" ]
-            [ Util.Time.formatDateShort item.created
+            [ texts.formatDateShort item.created
                 |> text
             ]
         ]
diff --git a/modules/webapp/src/main/elm/Comp/ItemCard.elm b/modules/webapp/src/main/elm/Comp/ItemCard.elm
index 175ef0e6..e904a2cb 100644
--- a/modules/webapp/src/main/elm/Comp/ItemCard.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemCard.elm
@@ -221,6 +221,14 @@ fulltextResultsContent2 item =
         (List.map renderHighlightEntry2 item.highlighting)
 
 
+templateCtx : Texts -> IT.TemplateContext
+templateCtx texts =
+    { dateFormatLong = texts.formatDateLong
+    , dateFormatShort = texts.formatDateShort
+    , directionLabel = texts.directionLabel
+    }
+
+
 metaDataContent2 : Texts -> UiSettings -> ItemLight -> Html Msg
 metaDataContent2 texts settings item =
     let
@@ -249,7 +257,7 @@ metaDataContent2 texts settings item =
                 , Comp.LinkTarget.makeSourceLink
                     [ ( "hover:opacity-60", True ) ]
                     SetLinkTarget
-                    (IT.render IT.source item)
+                    (IT.render IT.source (templateCtx texts) item)
                 ]
             ]
         ]
@@ -289,7 +297,7 @@ mainContent2 texts cardAction cardColor isConfirmed settings _ item =
                 [ class (Data.Direction.iconFromMaybe2 item.direction)
                 , class "mr-2 w-4 text-center"
                 , classList [ ( "hidden", fieldHidden Data.Fields.Direction ) ]
-                , IT.render IT.direction item |> title
+                , IT.render IT.direction (templateCtx texts) item |> title
                 ]
                 []
 
@@ -330,9 +338,9 @@ mainContent2 texts cardAction cardColor isConfirmed settings _ item =
             )
         , div
             [ class "font-bold py-1 text-lg"
-            , classList [ ( "hidden", IT.render titlePattern item == "" ) ]
+            , classList [ ( "hidden", IT.render titlePattern (templateCtx texts) item == "" ) ]
             ]
-            [ IT.render titlePattern item |> text
+            [ IT.render titlePattern (templateCtx texts) item |> text
             ]
         , div
             [ classList
@@ -347,11 +355,11 @@ mainContent2 texts cardAction cardColor isConfirmed settings _ item =
         , div
             [ classList
                 [ ( "opacity-75", True )
-                , ( "hidden", IT.render subtitlePattern item == "" )
+                , ( "hidden", IT.render subtitlePattern (templateCtx texts) item == "" )
                 ]
             ]
             [ dirIcon
-            , IT.render subtitlePattern item |> text
+            , IT.render subtitlePattern (templateCtx texts) item |> text
             ]
         , div [ class "" ]
             [ mainTagsAndFields2 settings item
@@ -466,7 +474,7 @@ previewMenu2 texts settings model item mainAttach =
                 |> Maybe.withDefault "/api/v1/sec/attachment/none"
 
         dueDate =
-            IT.render IT.dueDateShort item
+            IT.render IT.dueDateShort (templateCtx texts) item
 
         dueDateLabel =
             div
diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/EditForm.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/EditForm.elm
index d7455fc2..af92553f 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/EditForm.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/EditForm.elm
@@ -32,7 +32,6 @@ import Styles as S
 import Util.Folder
 import Util.Person
 import Util.Tag
-import Util.Time
 
 
 view2 : Texts -> Flags -> UiSettings -> Model -> Html Msg
@@ -467,7 +466,7 @@ renderItemDateSuggestions : Texts -> Model -> Html Msg
 renderItemDateSuggestions texts model =
     renderSuggestions texts
         model
-        Util.Time.formatDate
+        texts.formatDate
         (List.take 6 model.itemProposals.itemDate)
         SetItemDateSuggestion
 
@@ -476,7 +475,7 @@ renderDueDateSuggestions : Texts -> Model -> Html Msg
 renderDueDateSuggestions texts model =
     renderSuggestions texts
         model
-        Util.Time.formatDate
+        texts.formatDate
         (List.take 6 model.itemProposals.dueDate)
         SetDueDateSuggestion
 
diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/ItemInfoHeader.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/ItemInfoHeader.elm
index 08142a41..182ee51e 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/ItemInfoHeader.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/ItemInfoHeader.elm
@@ -19,7 +19,6 @@ import Messages.Comp.ItemDetail.ItemInfoHeader exposing (Texts)
 import Page exposing (Page(..))
 import Styles as S
 import Util.Maybe
-import Util.Time
 
 
 view : Texts -> UiSettings -> Model -> Html Msg
@@ -32,7 +31,7 @@ view texts settings model =
                 ]
                 [ Icons.dateIcon2 "mr-2"
                 , Maybe.withDefault model.item.created model.item.itemDate
-                    |> Util.Time.formatDate
+                    |> texts.formatDate
                     |> text
                 ]
             , Data.UiSettings.fieldVisible settings Data.Fields.Date
@@ -51,7 +50,7 @@ view texts settings model =
                 , title texts.dueDate
                 ]
                 [ Icons.dueDateIcon2 "mr-2"
-                , Maybe.map Util.Time.formatDate model.item.dueDate
+                , Maybe.map texts.formatDate model.item.dueDate
                     |> Maybe.withDefault ""
                     |> text
                 ]
diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm
index 8b1a5e77..4c1301ae 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/View2.elm
@@ -292,14 +292,14 @@ itemIdInfo texts model =
             , title texts.createdOn
             ]
             [ i [ class "fa fa-sun font-thin mr-2" ] []
-            , Util.Time.formatDateTime model.item.created |> text
+            , texts.formatDateTime model.item.created |> text
             ]
         , div
             [ class "inline-flex items-center"
             , title texts.lastUpdateOn
             ]
             [ i [ class "fa fa-pencil-alt mr-2" ] []
-            , Util.Time.formatDateTime model.item.updated |> text
+            , texts.formatDateTime model.item.updated |> text
             ]
         ]
 
diff --git a/modules/webapp/src/main/elm/Comp/SentMails.elm b/modules/webapp/src/main/elm/Comp/SentMails.elm
index 612223f6..05d2eb48 100644
--- a/modules/webapp/src/main/elm/Comp/SentMails.elm
+++ b/modules/webapp/src/main/elm/Comp/SentMails.elm
@@ -15,7 +15,6 @@ import Html.Attributes exposing (..)
 import Html.Events exposing (onClick)
 import Messages.Comp.SentMails exposing (Texts)
 import Styles as S
-import Util.Time
 
 
 type alias Model =
@@ -82,7 +81,7 @@ view2 texts model =
                             [ text (texts.date ++ ":")
                             ]
                         , div [ class "ml-2" ]
-                            [ Util.Time.formatDateTime mail.created |> text
+                            [ texts.formatDateTime mail.created |> text
                             ]
                         ]
                     , div [ class "flex flex-row" ]
@@ -131,13 +130,13 @@ view2 texts model =
                     ]
                 , tbody [] <|
                     List.map
-                        renderLine2
+                        (renderLine2 texts)
                         model.mails
                 ]
 
 
-renderLine2 : SentMail -> Html Msg
-renderLine2 mail =
+renderLine2 : Texts -> SentMail -> Html Msg
+renderLine2 texts mail =
     tr [ class S.tableRow ]
         [ td []
             [ B.linkLabel
@@ -152,7 +151,7 @@ renderLine2 mail =
             ]
         , td [ class "hidden" ] [ text mail.subject ]
         , td [ class "hidden text-center xl:table-cell" ]
-            [ Util.Time.formatDateTime mail.created |> text
+            [ texts.formatDateTime mail.created |> text
             ]
         , td [ class "hidden" ] [ text mail.sender ]
         ]
diff --git a/modules/webapp/src/main/elm/Comp/UserTable.elm b/modules/webapp/src/main/elm/Comp/UserTable.elm
index b30ee285..e247090a 100644
--- a/modules/webapp/src/main/elm/Comp/UserTable.elm
+++ b/modules/webapp/src/main/elm/Comp/UserTable.elm
@@ -13,7 +13,6 @@ import Html exposing (..)
 import Html.Attributes exposing (..)
 import Messages.Comp.UserTable exposing (Texts)
 import Styles as S
-import Util.Time exposing (formatDateTime)
 
 
 type alias Model =
@@ -93,9 +92,9 @@ renderUserLine2 texts model user =
             [ String.fromInt user.loginCount |> text
             ]
         , td [ class "hidden sm:table-cell text-center" ]
-            [ Maybe.map formatDateTime user.lastLogin |> Maybe.withDefault "" |> text
+            [ Maybe.map texts.formatDateTime user.lastLogin |> Maybe.withDefault "" |> text
             ]
         , td [ class "hidden md:table-cell text-center" ]
-            [ formatDateTime user.created |> text
+            [ texts.formatDateTime user.created |> text
             ]
         ]
diff --git a/modules/webapp/src/main/elm/Data/ItemTemplate.elm b/modules/webapp/src/main/elm/Data/ItemTemplate.elm
index 8924ad8e..f0411401 100644
--- a/modules/webapp/src/main/elm/Data/ItemTemplate.elm
+++ b/modules/webapp/src/main/elm/Data/ItemTemplate.elm
@@ -1,5 +1,6 @@
 module Data.ItemTemplate exposing
     ( ItemTemplate
+    , TemplateContext
     , concEquip
     , concPerson
     , concat
@@ -30,15 +31,21 @@ module Data.ItemTemplate exposing
 
 import Api.Model.IdName exposing (IdName)
 import Api.Model.ItemLight exposing (ItemLight)
-import Data.Direction
+import Data.Direction exposing (Direction)
 import Set
 import Util.List
 import Util.String
-import Util.Time
+
+
+type alias TemplateContext =
+    { dateFormatLong : Int -> String
+    , dateFormatShort : Int -> String
+    , directionLabel : Direction -> String
+    }
 
 
 type ItemTemplate
-    = ItemTemplate (ItemLight -> String)
+    = ItemTemplate (TemplateContext -> ItemLight -> String)
 
 
 readTemplate : String -> Maybe ItemTemplate
@@ -55,16 +62,23 @@ readTemplate str =
         Maybe.map read (splitTokens str)
 
 
-render : ItemTemplate -> ItemLight -> String
-render pattern item =
+render : ItemTemplate -> TemplateContext -> ItemLight -> String
+render pattern ctx item =
     case pattern of
         ItemTemplate f ->
-            f item
+            f ctx item
 
 
 isEmpty : ItemTemplate -> ItemLight -> Bool
 isEmpty pattern item =
-    render pattern item |> String.isEmpty
+    let
+        ctx =
+            { dateFormatLong = \_ -> "non-empty"
+            , dateFormatShort = \_ -> "non-empty"
+            , directionLabel = \_ -> "non-empty"
+            }
+    in
+    render pattern ctx item |> String.isEmpty
 
 
 nonEmpty : ItemTemplate -> ItemLight -> Bool
@@ -80,14 +94,14 @@ map : (String -> String) -> ItemTemplate -> ItemTemplate
 map f pattern =
     case pattern of
         ItemTemplate p ->
-            from (p >> f)
+            ItemTemplate (\ctx -> p ctx >> f)
 
 
 map2 : (String -> String -> String) -> ItemTemplate -> ItemTemplate -> ItemTemplate
 map2 f pattern1 pattern2 =
     case ( pattern1, pattern2 ) of
         ( ItemTemplate p1, ItemTemplate p2 ) ->
-            from (\i -> f (p1 i) (p2 i))
+            ItemTemplate (\ctx -> \i -> f (p1 ctx i) (p2 ctx i))
 
 
 combine : String -> ItemTemplate -> ItemTemplate -> ItemTemplate
@@ -104,21 +118,23 @@ combine sep p1 p2 =
 
 concat : List ItemTemplate -> ItemTemplate
 concat patterns =
-    from
-        (\i ->
-            List.map (\p -> render p i) patterns
-                |> String.join ""
+    ItemTemplate
+        (\ctx ->
+            \i ->
+                List.map (\p -> render p ctx i) patterns
+                    |> String.join ""
         )
 
 
 firstNonEmpty : List ItemTemplate -> ItemTemplate
 firstNonEmpty patterns =
-    from
-        (\i ->
-            List.map (\p -> render p i) patterns
-                |> List.filter (String.isEmpty >> not)
-                |> List.head
-                |> Maybe.withDefault ""
+    ItemTemplate
+        (\ctx ->
+            \i ->
+                List.map (\p -> render p ctx i) patterns
+                    |> List.filter (String.isEmpty >> not)
+                    |> List.head
+                    |> Maybe.withDefault ""
         )
 
 
@@ -128,17 +144,17 @@ firstNonEmpty patterns =
 
 from : (ItemLight -> String) -> ItemTemplate
 from f =
-    ItemTemplate f
+    ItemTemplate (\_ -> f)
 
 
-fromMaybe : (ItemLight -> Maybe String) -> ItemTemplate
+fromMaybe : (TemplateContext -> ItemLight -> Maybe String) -> ItemTemplate
 fromMaybe f =
-    ItemTemplate (f >> Maybe.withDefault "")
+    ItemTemplate (\ctx -> f ctx >> Maybe.withDefault "")
 
 
 literal : String -> ItemTemplate
 literal str =
-    ItemTemplate (\_ -> str)
+    ItemTemplate (\_ -> \_ -> str)
 
 
 empty : ItemTemplate
@@ -148,57 +164,57 @@ empty =
 
 name : ItemTemplate
 name =
-    ItemTemplate (.name >> Util.String.underscoreToSpace)
+    from (.name >> Util.String.underscoreToSpace)
 
 
 direction : ItemTemplate
 direction =
     let
-        dirStr ms =
+        dirStr ctx ms =
             Maybe.andThen Data.Direction.fromString ms
-                |> Maybe.map Data.Direction.toString
+                |> Maybe.map ctx.directionLabel
     in
-    fromMaybe (.direction >> dirStr)
+    fromMaybe (\ctx -> .direction >> dirStr ctx)
 
 
 dateLong : ItemTemplate
 dateLong =
-    ItemTemplate (.date >> Util.Time.formatDate)
+    ItemTemplate (\ctx -> .date >> ctx.dateFormatLong)
 
 
 dateShort : ItemTemplate
 dateShort =
-    ItemTemplate (.date >> Util.Time.formatDateShort)
+    ItemTemplate (\ctx -> .date >> ctx.dateFormatShort)
 
 
 dueDateLong : ItemTemplate
 dueDateLong =
-    fromMaybe (.dueDate >> Maybe.map Util.Time.formatDate)
+    fromMaybe (\ctx -> .dueDate >> Maybe.map ctx.dateFormatLong)
 
 
 dueDateShort : ItemTemplate
 dueDateShort =
-    fromMaybe (.dueDate >> Maybe.map Util.Time.formatDateShort)
+    fromMaybe (\ctx -> .dueDate >> Maybe.map ctx.dateFormatShort)
 
 
 source : ItemTemplate
 source =
-    ItemTemplate .source
+    from .source
 
 
 folder : ItemTemplate
 folder =
-    ItemTemplate (.folder >> getName)
+    from (.folder >> getName)
 
 
 corrOrg : ItemTemplate
 corrOrg =
-    ItemTemplate (.corrOrg >> getName)
+    from (.corrOrg >> getName)
 
 
 corrPerson : ItemTemplate
 corrPerson =
-    ItemTemplate (.corrPerson >> getName)
+    from (.corrPerson >> getName)
 
 
 correspondent : ItemTemplate
@@ -208,12 +224,12 @@ correspondent =
 
 concPerson : ItemTemplate
 concPerson =
-    ItemTemplate (.concPerson >> getName)
+    from (.concPerson >> getName)
 
 
 concEquip : ItemTemplate
 concEquip =
-    ItemTemplate (.concEquipment >> getName)
+    from (.concEquipment >> getName)
 
 
 concerning : ItemTemplate
@@ -223,7 +239,7 @@ concerning =
 
 fileCount : ItemTemplate
 fileCount =
-    ItemTemplate (.attachments >> List.length >> String.fromInt)
+    from (.attachments >> List.length >> String.fromInt)
 
 
 
diff --git a/modules/webapp/src/main/elm/Messages/Comp/AttachmentMeta.elm b/modules/webapp/src/main/elm/Messages/Comp/AttachmentMeta.elm
index ac44e655..6e2e2383 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/AttachmentMeta.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/AttachmentMeta.elm
@@ -1,6 +1,8 @@
 module Messages.Comp.AttachmentMeta exposing (Texts, gb)
 
 import Messages.Basics
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -15,6 +17,7 @@ type alias Texts =
     , concerningEquipment : String
     , itemDate : String
     , itemDueDate : String
+    , formatDateShort : Int -> String
     }
 
 
@@ -31,4 +34,5 @@ gb =
     , concerningEquipment = "Concerning Equipment"
     , itemDate = "Item Date"
     , itemDueDate = "Item Due Date"
+    , formatDateShort = DF.formatDateShort Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/CalEventInput.elm b/modules/webapp/src/main/elm/Messages/Comp/CalEventInput.elm
index 7953e8f1..1f83a01e 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/CalEventInput.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/CalEventInput.elm
@@ -1,5 +1,8 @@
 module Messages.Comp.CalEventInput exposing (Texts, gb)
 
+import Messages.DateFormat as DF
+import Messages.UiLanguage
+
 
 type alias Texts =
     { weekday : String
@@ -11,6 +14,7 @@ type alias Texts =
     , error : String
     , schedule : String
     , next : String
+    , formatDateTime : Int -> String
     }
 
 
@@ -25,4 +29,5 @@ gb =
     , error = "Error"
     , schedule = "Schedule"
     , next = "Next"
+    , formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/CustomFieldTable.elm b/modules/webapp/src/main/elm/Messages/Comp/CustomFieldTable.elm
index 9c678b48..e3b302a5 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/CustomFieldTable.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/CustomFieldTable.elm
@@ -1,6 +1,8 @@
 module Messages.Comp.CustomFieldTable exposing (Texts, gb)
 
 import Messages.Basics
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -8,6 +10,7 @@ type alias Texts =
     , nameLabel : String
     , format : String
     , usageCount : String
+    , formatDateShort : Int -> String
     }
 
 
@@ -17,4 +20,5 @@ gb =
     , nameLabel = "Name/Label"
     , format = "Format"
     , usageCount = "#Usage"
+    , formatDateShort = DF.formatDateShort Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/FolderTable.elm b/modules/webapp/src/main/elm/Messages/Comp/FolderTable.elm
index 8be11667..ce415b22 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/FolderTable.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/FolderTable.elm
@@ -1,11 +1,14 @@
 module Messages.Comp.FolderTable exposing (Texts, gb)
 
 import Messages.Basics
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
     { basics : Messages.Basics.Texts
     , memberCount : String
+    , formatDateShort : Int -> String
     }
 
 
@@ -13,4 +16,5 @@ gb : Texts
 gb =
     { basics = Messages.Basics.gb
     , memberCount = "#Member"
+    , formatDateShort = DF.formatDateShort Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/ItemCard.elm b/modules/webapp/src/main/elm/Messages/Comp/ItemCard.elm
index 9888a2d1..d89c10e6 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/ItemCard.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/ItemCard.elm
@@ -1,6 +1,10 @@
 module Messages.Comp.ItemCard exposing (Texts, gb)
 
+import Data.Direction exposing (Direction)
 import Messages.Basics
+import Messages.Data.Direction
+import Messages.DateFormat
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -10,6 +14,9 @@ type alias Texts =
     , openAttachmentFile : String
     , gotoDetail : String
     , cycleAttachments : String
+    , formatDateLong : Int -> String
+    , formatDateShort : Int -> String
+    , directionLabel : Direction -> String
     }
 
 
@@ -21,4 +28,7 @@ gb =
     , openAttachmentFile = "Open attachment file"
     , gotoDetail = "Go to detail view"
     , cycleAttachments = "Cycle attachments"
+    , formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.English
+    , formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.English
+    , directionLabel = Messages.Data.Direction.gb
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm
index 24ebed54..8a72a70d 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail.elm
@@ -7,6 +7,8 @@ import Messages.Comp.ItemDetail.Notes
 import Messages.Comp.ItemDetail.SingleAttachment
 import Messages.Comp.ItemMail
 import Messages.Comp.SentMails
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -34,6 +36,7 @@ type alias Texts =
     , createdOn : String
     , lastUpdateOn : String
     , sendingMailNow : String
+    , formatDateTime : Int -> String
     }
 
 
@@ -63,4 +66,5 @@ gb =
     , createdOn = "Created on"
     , lastUpdateOn = "Last update on"
     , sendingMailNow = "Sending e-mail…"
+    , formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/EditForm.elm b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/EditForm.elm
index d3674362..85290dea 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/EditForm.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/EditForm.elm
@@ -2,6 +2,8 @@ module Messages.Comp.ItemDetail.EditForm exposing (Texts, gb)
 
 import Messages.Basics
 import Messages.Comp.CustomFieldMultiInput
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -21,6 +23,7 @@ type alias Texts =
     , addNewEquipment : String
     , editEquipment : String
     , suggestions : String
+    , formatDate : Int -> String
     }
 
 
@@ -47,4 +50,5 @@ item visible. This message will disappear then.
     , addNewEquipment = "Add new equipment"
     , editEquipment = "Edit equipment"
     , suggestions = "Suggestions"
+    , formatDate = DF.formatDateLong Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/ItemInfoHeader.elm b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/ItemInfoHeader.elm
index 5e57fb42..96947b30 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/ItemInfoHeader.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/ItemDetail/ItemInfoHeader.elm
@@ -1,6 +1,8 @@
 module Messages.Comp.ItemDetail.ItemInfoHeader exposing (Texts, gb)
 
 import Messages.Basics
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -9,6 +11,7 @@ type alias Texts =
     , dueDate : String
     , source : String
     , new : String
+    , formatDate : Int -> String
     }
 
 
@@ -19,4 +22,5 @@ gb =
     , dueDate = "Due Date"
     , source = "Source"
     , new = "New"
+    , formatDate = DF.formatDateLong Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/SentMails.elm b/modules/webapp/src/main/elm/Messages/Comp/SentMails.elm
index 094e55d5..f33a0812 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/SentMails.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/SentMails.elm
@@ -1,5 +1,8 @@
 module Messages.Comp.SentMails exposing (Texts, gb)
 
+import Messages.DateFormat as DF
+import Messages.UiLanguage
+
 
 type alias Texts =
     { from : String
@@ -8,6 +11,7 @@ type alias Texts =
     , subject : String
     , sent : String
     , sender : String
+    , formatDateTime : Int -> String
     }
 
 
@@ -19,4 +23,5 @@ gb =
     , subject = "Subject"
     , sent = "Sent"
     , sender = "Sender"
+    , formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Comp/UserTable.elm b/modules/webapp/src/main/elm/Messages/Comp/UserTable.elm
index 7e40562d..03a657a6 100644
--- a/modules/webapp/src/main/elm/Messages/Comp/UserTable.elm
+++ b/modules/webapp/src/main/elm/Messages/Comp/UserTable.elm
@@ -1,6 +1,8 @@
 module Messages.Comp.UserTable exposing (Texts, gb)
 
 import Messages.Basics
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -10,6 +12,7 @@ type alias Texts =
     , email : String
     , logins : String
     , lastLogin : String
+    , formatDateTime : Int -> String
     }
 
 
@@ -21,4 +24,5 @@ gb =
     , email = "E-Mail"
     , logins = "Logins"
     , lastLogin = "Last Login"
+    , formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Messages/Data/Direction.elm b/modules/webapp/src/main/elm/Messages/Data/Direction.elm
new file mode 100644
index 00000000..ed520c3d
--- /dev/null
+++ b/modules/webapp/src/main/elm/Messages/Data/Direction.elm
@@ -0,0 +1,13 @@
+module Messages.Data.Direction exposing (gb)
+
+import Data.Direction exposing (Direction(..))
+
+
+gb : Direction -> String
+gb dir =
+    case dir of
+        Incoming ->
+            "Incoming"
+
+        Outgoing ->
+            "Outgoing"
diff --git a/modules/webapp/src/main/elm/Messages/DateFormat.elm b/modules/webapp/src/main/elm/Messages/DateFormat.elm
new file mode 100644
index 00000000..e49a03df
--- /dev/null
+++ b/modules/webapp/src/main/elm/Messages/DateFormat.elm
@@ -0,0 +1,433 @@
+module Messages.DateFormat exposing
+    ( format
+    , formatDateLong
+    , formatDateShort
+    , formatDateTimeLong
+    )
+
+import DateFormat exposing (Token)
+import DateFormat.Language as DL
+import Messages.UiLanguage exposing (UiLanguage(..))
+import Time
+    exposing
+        ( Month(..)
+        , Weekday(..)
+        )
+
+
+type alias DateTimeMsg =
+    { dateLong : List Token
+    , dateShort : List Token
+    , dateTimeLong : List Token
+    , dateTimeShort : List Token
+    , lang : DL.Language
+    }
+
+
+get : UiLanguage -> DateTimeMsg
+get lang =
+    case lang of
+        English ->
+            gb
+
+
+format : UiLanguage -> (DateTimeMsg -> List Token) -> Int -> String
+format lang pattern millis =
+    let
+        msg =
+            get lang
+
+        fmt =
+            DateFormat.formatWithLanguage msg.lang (pattern msg)
+    in
+    fmt Time.utc (Time.millisToPosix millis)
+
+
+formatDateTimeLong : UiLanguage -> Int -> String
+formatDateTimeLong lang millis =
+    format lang .dateTimeLong millis
+
+
+formatDateLong : UiLanguage -> Int -> String
+formatDateLong lang millis =
+    format lang .dateLong millis
+
+
+formatDateShort : UiLanguage -> Int -> String
+formatDateShort lang millis =
+    format lang .dateShort millis
+
+
+
+--- Language Definitions
+
+
+gb : DateTimeMsg
+gb =
+    { dateLong =
+        [ DateFormat.dayOfWeekNameAbbreviated
+        , DateFormat.text ", "
+        , DateFormat.monthNameFull
+        , DateFormat.text " "
+        , DateFormat.dayOfMonthSuffix
+        , DateFormat.text ", "
+        , DateFormat.yearNumber
+        ]
+    , dateShort =
+        [ DateFormat.yearNumber
+        , DateFormat.text "/"
+        , DateFormat.monthFixed
+        , DateFormat.text "/"
+        , DateFormat.dayOfMonthFixed
+        ]
+    , dateTimeLong =
+        [ DateFormat.dayOfWeekNameAbbreviated
+        , DateFormat.text ", "
+        , DateFormat.monthNameFull
+        , DateFormat.text " "
+        , DateFormat.dayOfMonthSuffix
+        , DateFormat.text ", "
+        , DateFormat.yearNumber
+        , DateFormat.text ", "
+        , DateFormat.hourMilitaryNumber
+        , DateFormat.text ":"
+        , DateFormat.minuteFixed
+        ]
+    , dateTimeShort =
+        [ DateFormat.yearNumber
+        , DateFormat.text "/"
+        , DateFormat.monthFixed
+        , DateFormat.text "/"
+        , DateFormat.dayOfMonthFixed
+        , DateFormat.text " "
+        , DateFormat.hourMilitaryNumber
+        , DateFormat.text ":"
+        , DateFormat.minuteFixed
+        ]
+    , lang = DL.english
+    }
+
+
+de : DateTimeMsg
+de =
+    { dateLong =
+        [ DateFormat.dayOfWeekNameAbbreviated
+        , DateFormat.text ", "
+        , DateFormat.dayOfMonthSuffix
+        , DateFormat.text " "
+        , DateFormat.monthNameFull
+        , DateFormat.text " "
+        , DateFormat.yearNumber
+        ]
+    , dateShort =
+        [ DateFormat.dayOfMonthFixed
+        , DateFormat.text "."
+        , DateFormat.monthFixed
+        , DateFormat.text "."
+        , DateFormat.yearNumber
+        ]
+    , dateTimeLong =
+        [ DateFormat.dayOfWeekNameAbbreviated
+        , DateFormat.text ". "
+        , DateFormat.dayOfMonthSuffix
+        , DateFormat.text " "
+        , DateFormat.monthNameFull
+        , DateFormat.text " "
+        , DateFormat.yearNumber
+        , DateFormat.text ", "
+        , DateFormat.hourMilitaryNumber
+        , DateFormat.text ":"
+        , DateFormat.minuteFixed
+        ]
+    , dateTimeShort =
+        [ DateFormat.dayOfMonthFixed
+        , DateFormat.text "."
+        , DateFormat.monthFixed
+        , DateFormat.text "."
+        , DateFormat.yearNumber
+        , DateFormat.text " "
+        , DateFormat.hourMilitaryNumber
+        , DateFormat.text ":"
+        , DateFormat.minuteFixed
+        ]
+    , lang = german
+    }
+
+
+{-| French date formats; must be reviewed!
+-}
+fr : DateTimeMsg
+fr =
+    { dateLong =
+        [ DateFormat.dayOfWeekNameAbbreviated
+        , DateFormat.text ", "
+        , DateFormat.dayOfMonthSuffix
+        , DateFormat.text " "
+        , DateFormat.monthNameFull
+        , DateFormat.text " "
+        , DateFormat.yearNumber
+        ]
+    , dateShort =
+        [ DateFormat.dayOfMonthFixed
+        , DateFormat.text "."
+        , DateFormat.monthFixed
+        , DateFormat.text "."
+        , DateFormat.yearNumber
+        ]
+    , dateTimeLong =
+        [ DateFormat.dayOfWeekNameAbbreviated
+        , DateFormat.text ". "
+        , DateFormat.dayOfMonthSuffix
+        , DateFormat.text " "
+        , DateFormat.monthNameFull
+        , DateFormat.text " "
+        , DateFormat.yearNumber
+        , DateFormat.text ", "
+        , DateFormat.hourMilitaryNumber
+        , DateFormat.text ":"
+        , DateFormat.minuteFixed
+        ]
+    , dateTimeShort =
+        [ DateFormat.dayOfMonthFixed
+        , DateFormat.text "."
+        , DateFormat.monthFixed
+        , DateFormat.text "."
+        , DateFormat.yearNumber
+        , DateFormat.text " "
+        , DateFormat.hourMilitaryNumber
+        , DateFormat.text ":"
+        , DateFormat.minuteFixed
+        ]
+    , lang = french
+    }
+
+
+
+--- Languages for the DateFormat module
+-- French
+
+
+{-| The French language!
+-}
+french : DL.Language
+french =
+    DL.Language
+        toFrenchMonthName
+        toFrenchMonthAbbreviation
+        toFrenchWeekdayName
+        (toFrenchWeekdayName >> String.left 3)
+        toEnglishAmPm
+        toFrenchOrdinalSuffix
+
+
+toFrenchMonthName : Month -> String
+toFrenchMonthName month =
+    case month of
+        Jan ->
+            "janvier"
+
+        Feb ->
+            "février"
+
+        Mar ->
+            "mars"
+
+        Apr ->
+            "avril"
+
+        May ->
+            "mai"
+
+        Jun ->
+            "juin"
+
+        Jul ->
+            "juillet"
+
+        Aug ->
+            "août"
+
+        Sep ->
+            "septembre"
+
+        Oct ->
+            "octobre"
+
+        Nov ->
+            "novembre"
+
+        Dec ->
+            "décembre"
+
+
+toFrenchMonthAbbreviation : Month -> String
+toFrenchMonthAbbreviation month =
+    case month of
+        Jan ->
+            "janv"
+
+        Feb ->
+            "févr"
+
+        Mar ->
+            "mars"
+
+        Apr ->
+            "avr"
+
+        May ->
+            "mai"
+
+        Jun ->
+            "juin"
+
+        Jul ->
+            "juil"
+
+        Aug ->
+            "août"
+
+        Sep ->
+            "sept"
+
+        Oct ->
+            "oct"
+
+        Nov ->
+            "nov"
+
+        Dec ->
+            "déc"
+
+
+toFrenchWeekdayName : Weekday -> String
+toFrenchWeekdayName weekday =
+    case weekday of
+        Mon ->
+            "lundi"
+
+        Tue ->
+            "mardi"
+
+        Wed ->
+            "mercredi"
+
+        Thu ->
+            "jeudi"
+
+        Fri ->
+            "vendredi"
+
+        Sat ->
+            "samedi"
+
+        Sun ->
+            "dimanche"
+
+
+toFrenchOrdinalSuffix : Int -> String
+toFrenchOrdinalSuffix n =
+    if n == 1 then
+        "er"
+
+    else
+        ""
+
+
+
+-- German
+
+
+{-| The German language!
+-}
+german : DL.Language
+german =
+    let
+        withDot str =
+            str ++ "."
+    in
+    DL.Language
+        toGermanMonthName
+        (toGermanMonthName >> String.left 3 >> withDot)
+        toGermanWeekdayName
+        (toGermanWeekdayName >> String.left 2 >> withDot)
+        toEnglishAmPm
+        (\_ -> ".")
+
+
+toGermanMonthName : Month -> String
+toGermanMonthName month =
+    case month of
+        Jan ->
+            "Januar"
+
+        Feb ->
+            "Februar"
+
+        Mar ->
+            "März"
+
+        Apr ->
+            "April"
+
+        May ->
+            "Mai"
+
+        Jun ->
+            "Juni"
+
+        Jul ->
+            "Juli"
+
+        Aug ->
+            "August"
+
+        Sep ->
+            "September"
+
+        Oct ->
+            "Oktober"
+
+        Nov ->
+            "November"
+
+        Dec ->
+            "Dezember"
+
+
+toGermanWeekdayName : Weekday -> String
+toGermanWeekdayName weekday =
+    case weekday of
+        Mon ->
+            "Montag"
+
+        Tue ->
+            "Dienstag"
+
+        Wed ->
+            "Mittwoch"
+
+        Thu ->
+            "Donnerstag"
+
+        Fri ->
+            "Freitag"
+
+        Sat ->
+            "Samstag"
+
+        Sun ->
+            "Sonntag"
+
+
+
+--- Copy from DateFormat.Language
+
+
+toEnglishAmPm : Int -> String
+toEnglishAmPm hour =
+    if hour > 11 then
+        "pm"
+
+    else
+        "am"
diff --git a/modules/webapp/src/main/elm/Messages/Page/Queue.elm b/modules/webapp/src/main/elm/Messages/Page/Queue.elm
index acdd615a..012a7d09 100644
--- a/modules/webapp/src/main/elm/Messages/Page/Queue.elm
+++ b/modules/webapp/src/main/elm/Messages/Page/Queue.elm
@@ -1,6 +1,8 @@
 module Messages.Page.Queue exposing (Texts, gb)
 
 import Messages.Basics
+import Messages.DateFormat as DF
+import Messages.UiLanguage
 
 
 type alias Texts =
@@ -23,6 +25,7 @@ type alias Texts =
     , retries : String
     , changePriority : String
     , prio : String
+    , formatDateTime : Int -> String
     }
 
 
@@ -47,4 +50,5 @@ gb =
     , retries = "Retries"
     , changePriority = "Change priority of this job"
     , prio = "Prio"
+    , formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.English
     }
diff --git a/modules/webapp/src/main/elm/Page/Queue/View2.elm b/modules/webapp/src/main/elm/Page/Queue/View2.elm
index 16027514..425fd683 100644
--- a/modules/webapp/src/main/elm/Page/Queue/View2.elm
+++ b/modules/webapp/src/main/elm/Page/Queue/View2.elm
@@ -13,7 +13,7 @@ import Html.Events exposing (onClick)
 import Messages.Page.Queue exposing (Texts)
 import Page.Queue.Data exposing (..)
 import Styles as S
-import Util.Time exposing (formatDateTime, formatIsoDateTime)
+import Util.Time exposing (formatIsoDateTime)
 
 
 viewSidebar : Texts -> Bool -> Flags -> UiSettings -> Model -> Html Msg
@@ -397,7 +397,7 @@ renderInfoCard texts model job =
         , div [ class "flex flex-row space-x-2 items-center flex-wrap" ]
             [ div [ class "flex flex-row justify-start " ]
                 [ div [ class "text-xs font-semibold" ]
-                    [ Util.Time.formatDateTime job.submitted |> text
+                    [ texts.formatDateTime job.submitted |> text
                     ]
                 ]
             , div [ class "flex-grow flex flex-row justify-end space-x-2 flex-wrap" ]
diff --git a/modules/webapp/src/main/elm/Util/Time.elm b/modules/webapp/src/main/elm/Util/Time.elm
index 38f5922e..f34cc91d 100644
--- a/modules/webapp/src/main/elm/Util/Time.elm
+++ b/modules/webapp/src/main/elm/Util/Time.elm
@@ -1,47 +1,9 @@
-module Util.Time exposing
-    ( formatDate
-    , formatDateShort
-    , formatDateTime
-    , formatIsoDateTime
-    )
+module Util.Time exposing (formatIsoDateTime)
 
 import DateFormat
 import Time exposing (Posix, Zone, utc)
 
 
-dateFormatter : Zone -> Posix -> String
-dateFormatter =
-    DateFormat.format
-        [ DateFormat.dayOfWeekNameAbbreviated
-        , DateFormat.text ", "
-        , DateFormat.monthNameFull
-        , DateFormat.text " "
-        , DateFormat.dayOfMonthSuffix
-        , DateFormat.text ", "
-        , DateFormat.yearNumber
-        ]
-
-
-dateFormatterShort : Zone -> Posix -> String
-dateFormatterShort =
-    DateFormat.format
-        [ DateFormat.yearNumber
-        , DateFormat.text "/"
-        , DateFormat.monthFixed
-        , DateFormat.text "/"
-        , DateFormat.dayOfMonthFixed
-        ]
-
-
-timeFormatter : Zone -> Posix -> String
-timeFormatter =
-    DateFormat.format
-        [ DateFormat.hourMilitaryNumber
-        , DateFormat.text ":"
-        , DateFormat.minuteFixed
-        ]
-
-
 isoDateTimeFormatter : Zone -> Posix -> String
 isoDateTimeFormatter =
     DateFormat.format
@@ -64,44 +26,7 @@ timeZone =
     utc
 
 
-
-{- Format millis into "Wed, 10. Jan 2018, 18:57" -}
-
-
-formatDateTime : Int -> String
-formatDateTime millis =
-    formatDate millis ++ ", " ++ formatTime millis
-
-
 formatIsoDateTime : Int -> String
 formatIsoDateTime millis =
     Time.millisToPosix millis
         |> isoDateTimeFormatter timeZone
-
-
-
-{- Format millis into "18:57". The current time (not the duration of
-   the millis).
--}
-
-
-formatTime : Int -> String
-formatTime millis =
-    Time.millisToPosix millis
-        |> timeFormatter timeZone
-
-
-
-{- Format millis into "Wed, 10. Jan 2018" -}
-
-
-formatDate : Int -> String
-formatDate millis =
-    Time.millisToPosix millis
-        |> dateFormatter timeZone
-
-
-formatDateShort : Int -> String
-formatDateShort millis =
-    Time.millisToPosix millis
-        |> dateFormatterShort timeZone