diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js index d87d46f..873d6d6 100644 --- a/assets/tailwind.config.js +++ b/assets/tailwind.config.js @@ -12,7 +12,6 @@ module.exports = { "../lib/mv_web.ex", "../lib/mv_web/**/*.*ex" ], - safelist: ['h-screen', 'px-6', 'h-screen', 'place-items-center', 'px-20', 'px-24'], // Classes that are used by AshAuthentication Sign-In Page are otherwise purged theme: { extend: { colors: { diff --git a/lib/mv_web/auth_overrides.ex b/lib/mv_web/auth_overrides.ex index 367982e..63cdcf9 100644 --- a/lib/mv_web/auth_overrides.ex +++ b/lib/mv_web/auth_overrides.ex @@ -17,7 +17,7 @@ defmodule MvWeb.AuthOverrides do # Avoid full-width for the Sign In Form override AshAuthentication.Phoenix.Components.SignIn do - set :root_class, "min-w-md" + set :root_class, "md:min-w-md" end # Replace banner logo with text diff --git a/lib/mv_web/live_user_auth.ex b/lib/mv_web/live_user_auth.ex index d211245..9b2a1a7 100644 --- a/lib/mv_web/live_user_auth.ex +++ b/lib/mv_web/live_user_auth.ex @@ -36,9 +36,11 @@ defmodule MvWeb.LiveUserAuth do end end - def on_mount(:live_no_user, _params, _session, socket) do - Gettext.put_locale(MvWeb.Gettext, "de") - {:cont, assign(socket, :locale, "de")} + def on_mount(:live_no_user, _params, session, socket) do + # Set the locale for not logged in user to set the language + locale = session["locale"] || "en" + Gettext.put_locale(MvWeb.Gettext, locale) + {:cont, assign(socket, :locale, locale)} if socket.assigns[:current_user] do {:halt, Phoenix.LiveView.redirect(socket, to: ~p"/")} diff --git a/lib/mv_web/router.ex b/lib/mv_web/router.ex index 4a6e3d9..bf2c071 100644 --- a/lib/mv_web/router.ex +++ b/lib/mv_web/router.ex @@ -139,8 +139,47 @@ defmodule MvWeb.Router do end defp set_locale(conn, _opts) do - locale = get_session(conn, :locale) || "de" + locale = + get_session(conn, :locale) || + extract_locale_from_headers(conn.req_headers) + Gettext.put_locale(MvWeb.Gettext, locale) + conn + |> put_session(:locale, locale) + |> assign(:locale, locale) end + + # Get locale from user + defp extract_locale_from_headers(headers) do + headers + |> Enum.find_value(fn + {"accept-language", value} -> value + _ -> nil + end) + |> parse_accept_language() + |> Enum.find(&supported_locale?/1) + |> fallback_locale() + end + + defp parse_accept_language(nil), do: [] + + defp parse_accept_language(header) do + header + |> String.split(",") + |> Enum.map(&String.trim/1) + |> Enum.map(fn lang -> + lang + # we only want the first part + |> String.split(";") + |> hd() + |> String.split("-") + |> hd() + end) + end + + # Our supported languages for now are german and english, english as fallback language + defp supported_locale?(locale), do: locale in ["en", "de"] + defp fallback_locale(nil), do: "en" + defp fallback_locale(locale), do: locale end