Prepare for selecting languages

UI language is stored in user settings for authenticated users;
otherwise is only stored in the current model (not persisted).
This commit is contained in:
Eike Kettner
2021-03-27 22:00:50 +01:00
parent 9fcab84267
commit 322a3e837c
10 changed files with 335 additions and 1 deletions

View File

@ -2,6 +2,7 @@ module App.Data exposing
( Model
, Msg(..)
, defaultPage
, getUiLanguage
, init
)
@ -24,6 +25,7 @@ import Page.Queue.Data
import Page.Register.Data
import Page.Upload.Data
import Page.UserSettings.Data
import UiLanguage exposing (UiLanguage)
import Url exposing (Url)
@ -48,6 +50,8 @@ type alias Model =
, uiSettings : UiSettings
, sidebarVisible : Bool
, anonymousTheme : UiTheme
, anonymousUiLang : UiLanguage
, langMenuOpen : Bool
}
@ -97,6 +101,8 @@ init key url flags_ settings =
, uiSettings = settings
, sidebarVisible = settings.sideMenuVisible
, anonymousTheme = Data.UiTheme.Light
, anonymousUiLang = UiLanguage.English
, langMenuOpen = False
}
, Cmd.batch
[ Cmd.map UserSettingsMsg uc
@ -152,8 +158,20 @@ type Msg
| GetUiSettings UiSettings
| ToggleSidebar
| ToggleDarkMode
| ToggleLangMenu
| SetLanguage UiLanguage
defaultPage : Flags -> Page
defaultPage flags =
HomePage
getUiLanguage : Model -> UiLanguage
getUiLanguage model =
case model.flags.account of
Just _ ->
model.uiSettings.uiLang
Nothing ->
model.anonymousUiLang

View File

@ -84,6 +84,15 @@ updateWithSub msg model =
, Sub.none
)
ToggleLangMenu ->
( { model | langMenuOpen = not model.langMenuOpen }
, Cmd.none
, Sub.none
)
SetLanguage lang ->
( { model | anonymousUiLang = lang, langMenuOpen = False }, Cmd.none, Sub.none )
HomeMsg lm ->
updateHome lm model

View File

@ -7,6 +7,7 @@ import Data.Flags
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Messages
import Page exposing (Page(..))
import Page.CollectiveSettings.View2 as CollectiveSettings
import Page.Home.Data
@ -20,6 +21,7 @@ import Page.Register.View2 as Register
import Page.Upload.View2 as Upload
import Page.UserSettings.View2 as UserSettings
import Styles as S
import UiLanguage
view : Model -> List (Html Msg)
@ -64,13 +66,18 @@ topNavUser auth model =
topNavAnon : Model -> Html Msg
topNavAnon model =
let
texts =
Messages.get <| App.Data.getUiLanguage model
in
nav
[ id "top-nav"
, class styleTopNav
]
[ headerNavItem model
, div [ class "flex flex-grow justify-end" ]
[ a
[ langMenu model
, a
[ href "#"
, onClick ToggleDarkMode
, class dropdownLink
@ -100,6 +107,10 @@ headerNavItem model =
mainContent : Model -> Html Msg
mainContent model =
let
texts =
Messages.get <| App.Data.getUiLanguage model
in
div
[ id "main"
, class styleMain
@ -151,6 +162,45 @@ styleMain =
"mt-12 flex md:flex-row flex-col w-full h-screen-12 overflow-y-hidden bg-white dark:bg-bluegray-800 text-gray-800 dark:text-bluegray-300 antialiased"
langMenu : Model -> Html Msg
langMenu model =
let
texts =
Messages.get <| App.Data.getUiLanguage model
langItem lang =
let
langMsg =
Messages.get lang
in
a
[ classList
[ ( dropdownItem, True )
, ( "bg-gray-200 dark:bg-bluegray-700", lang == texts.lang )
]
, onClick (SetLanguage lang)
, href "#"
]
[ i [ langMsg |> .flagIcon |> class ] []
, span [ class "ml-2" ] [ text langMsg.label ]
]
in
div [ class "relative" ]
[ a
[ class dropdownLink
, onClick ToggleLangMenu
, href "#"
]
[ i [ class texts.flagIcon ] []
]
, div
[ class dropdownMenu
, classList [ ( "hidden", not model.langMenuOpen ) ]
]
(List.map langItem UiLanguage.all)
]
dataMenu : AuthResult -> Model -> Html Msg
dataMenu _ model =
div [ class "relative" ]