feat: set users locale

This commit is contained in:
carla 2025-08-14 16:22:36 +02:00
parent 992addf0ea
commit f0b0de0008
4 changed files with 46 additions and 6 deletions

View file

@ -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