Skip to content

Commit ddba3cd

Browse files
committed
Add force locale
1 parent b06e2c4 commit ddba3cd

File tree

4 files changed

+56
-8
lines changed

4 files changed

+56
-8
lines changed

apps/codebattle/lib/codebattle_web/plugs/locale.ex

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,30 @@ defmodule CodebattleWeb.Plugs.Locale do
1010
def init(_opts), do: nil
1111

1212
def call(conn, _opts) do
13-
default_locale = Application.get_env(:codebattle, :default_locale, "en")
14-
15-
locale =
16-
case conn.assigns[:current_user] do
17-
%{locale: locale} when locale in @valid_locales -> locale
18-
_ -> default_locale
19-
end
13+
locale = get_forced_locale() || get_user_locale(conn) || get_default_locale()
2014

2115
Gettext.put_locale(CodebattleWeb.Gettext, locale)
2216

2317
conn
2418
|> put_gon(locale: locale)
2519
|> put_session(:locale, locale)
2620
end
21+
22+
defp get_forced_locale do
23+
case Application.get_env(:codebattle, :force_locale) do
24+
locale when locale in @valid_locales -> locale
25+
_ -> nil
26+
end
27+
end
28+
29+
defp get_user_locale(conn) do
30+
case conn.assigns[:current_user] do
31+
%{locale: locale} when locale in @valid_locales -> locale
32+
_ -> nil
33+
end
34+
end
35+
36+
defp get_default_locale do
37+
Application.get_env(:codebattle, :default_locale, "en")
38+
end
2739
end

apps/codebattle/test/codebattle_web/controllers/locale_test.exs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
defmodule CodebattleWeb.LocaleTest do
2-
use CodebattleWeb.ConnCase, async: true
2+
use CodebattleWeb.ConnCase, async: false
3+
4+
setup do
5+
previous_force_locale = Application.get_env(:codebattle, :force_locale)
6+
7+
on_exit(fn ->
8+
Application.put_env(:codebattle, :force_locale, previous_force_locale)
9+
end)
10+
11+
:ok
12+
end
313

414
test "uses current user locale when available", %{conn: conn} do
515
user = insert(:user, locale: "ru")
@@ -28,4 +38,28 @@ defmodule CodebattleWeb.LocaleTest do
2838

2939
assert get_session(conn, :locale) == "en"
3040
end
41+
42+
test "uses forced locale over current user locale", %{conn: conn} do
43+
Application.put_env(:codebattle, :force_locale, "ru")
44+
user = insert(:user, locale: "en")
45+
46+
conn =
47+
conn
48+
|> put_session(:user_id, user.id)
49+
|> get(Routes.root_path(conn, :index))
50+
51+
assert get_session(conn, :locale) == "ru"
52+
end
53+
54+
test "ignores unsupported forced locale", %{conn: conn} do
55+
Application.put_env(:codebattle, :force_locale, "de")
56+
user = insert(:user, locale: "ru")
57+
58+
conn =
59+
conn
60+
|> put_session(:user_id, user.id)
61+
|> get(Routes.root_path(conn, :index))
62+
63+
assert get_session(conn, :locale) == "ru"
64+
end
3165
end

config/config.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ config :codebattle, dev_sign_in: true
8787
# General application configuration
8888
config :codebattle, ecto_repos: [Codebattle.Repo]
8989
config :codebattle, fake_html_to_image: false
90+
config :codebattle, force_locale: System.get_env("CODEBATTLE_FORCE_LOCALE")
9091
config :codebattle, free_users_redirect_url: "/"
9192
config :codebattle, freeze_time: false
9293
config :codebattle, html_debug_mode: true

config/runtime.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ config :codebattle, default_locale: System.get_env("CODEBATTLE_DEFAULT_LOCALE",
183183
config :codebattle,
184184
deployed_at: System.get_env("DEPLOYED_AT") || Calendar.strftime(DateTime.utc_now(), "%c")
185185

186+
config :codebattle, force_locale: System.get_env("CODEBATTLE_FORCE_LOCALE")
186187
config :codebattle, free_users_redirect_url: System.get_env("CODEBATTLE_FREE_USERS_REDIRECT_URL", "/")
187188
config :codebattle, host: codebattle_host
188189
config :codebattle, k8s_namespace: System.get_env("KUBERNETES_NAMESPACE", "default")

0 commit comments

Comments
 (0)