-
Notifications
You must be signed in to change notification settings - Fork 62
/
set_locale.ex
60 lines (50 loc) · 1.41 KB
/
set_locale.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
defmodule NervesHubWWWWeb.Plugs.SetLocale do
import Plug.Conn
def init(default), do: default
def call(conn, _config) do
conn
|> get_locale_from_header()
|> case do
nil ->
conn
|> put_resp_header(
"content-language",
Application.get_env(:nerves_hub_www, NervesHubWWWWeb.Gettext)[:default_locale]
)
locale ->
Gettext.put_locale(NervesHubWWWWeb.Gettext, locale)
conn
|> put_resp_header("content-language", locale)
end
end
defp get_locale_from_header(conn) do
conn
|> extract_accept_language()
|> Enum.find(nil, fn accepted_locale ->
Gettext.known_locales(NervesHubWWWWeb.Gettext)
|> Enum.member?(accepted_locale)
end)
end
defp extract_accept_language(conn) do
case Plug.Conn.get_req_header(conn, "accept-language") do
[value | _] ->
value
|> String.split(",")
|> Enum.map(&parse_language_option/1)
|> Enum.sort(&(&1.quality > &2.quality))
|> Enum.map(& &1.tag)
|> Enum.reject(&is_nil/1)
_ ->
[]
end
end
defp parse_language_option(string) do
captures = Regex.named_captures(~r/^\s?(?<tag>[\w\-]+)(?:;q=(?<quality>[\d\.]+))?$/i, string)
quality =
case Float.parse(captures["quality"] || "1.0") do
{val, _} -> val
_ -> 1.0
end
%{tag: captures["tag"], quality: quality}
end
end