From fac629c010dd1c73ef97ce51fbd5db45c32842fe Mon Sep 17 00:00:00 2001 From: Rainer <57937814+raerkeer@users.noreply.github.com> Date: Wed, 20 Nov 2019 09:37:48 +0100 Subject: [PATCH 1/3] Put the locale into the session for LiveView To get set_locale working with Phoenix LiveView, we need to put the locale into the session --- lib/set_locale.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/set_locale.ex b/lib/set_locale.ex index d55b376..0db62e0 100644 --- a/lib/set_locale.ex +++ b/lib/set_locale.ex @@ -39,6 +39,7 @@ defmodule SetLocale do do: Gettext.put_locale(config.gettext, config.default_locale), else: Gettext.put_locale(config.gettext, requested_locale) assign(conn, :locale, requested_locale) + put_session(conn, :locale, requested_locale) else path = rewrite_path(conn, requested_locale, config) From 7f7c3dd08d547797515ddfdbe8096e3a5d140672 Mon Sep 17 00:00:00 2001 From: Rainer <57937814+raerkeer@users.noreply.github.com> Date: Wed, 20 Nov 2019 09:56:22 +0100 Subject: [PATCH 2/3] Updated readme with instructions for Phoenix LiveView --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 0fe3522..0aec02e 100644 --- a/README.md +++ b/README.md @@ -63,10 +63,21 @@ defmodule MyApp.Router do pipe_through :browser get "/", PageController, :index ... + # If you are using Phoenix LiveView, use the following: + live "/livepage", PageLive, session: [:locale] end end ``` +### Phoenix LiveView +You need to set the locale in the mount/2 function of your page +```elixir +def mount(session, socket) do + Gettext.put_locale(session.locale) + ... +end +``` + ### Options - gettext: mandatory - default_locale: mandatory, used as last step in fallback chain From d6242f5ad5c1114a337bda04573944b17fb64c25 Mon Sep 17 00:00:00 2001 From: Sampo Date: Sun, 11 Apr 2021 15:41:46 +0900 Subject: [PATCH 3/3] Fix using session for LiveView The conn ended up missing :locale assign, so used the pipe operator there. Also added tests to see if the session actually contains the locale. --- lib/set_locale.ex | 5 +++-- test/set_locale_test.exs | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/set_locale.ex b/lib/set_locale.ex index 0db62e0..e167477 100644 --- a/lib/set_locale.ex +++ b/lib/set_locale.ex @@ -38,8 +38,9 @@ defmodule SetLocale do if Enum.member?(config.additional_locales, requested_locale), do: Gettext.put_locale(config.gettext, config.default_locale), else: Gettext.put_locale(config.gettext, requested_locale) - assign(conn, :locale, requested_locale) - put_session(conn, :locale, requested_locale) + conn + |> assign(:locale, requested_locale) + |> put_session(:locale, requested_locale) else path = rewrite_path(conn, requested_locale, config) diff --git a/test/set_locale_test.exs b/test/set_locale_test.exs index 81574ef..2d0d6c7 100644 --- a/test/set_locale_test.exs +++ b/test/set_locale_test.exs @@ -21,6 +21,12 @@ defmodule SetLocaleTest do default_locale: @default_locale, additional_locales: ["fr", "es"] } + @session Plug.Session.init( + store: :cookie, + key: "_set_locale", + encryption_salt: "set_locale", + signing_salt: "set_locale" + ) describe "init" do test "it supports a legacy config" do @@ -338,11 +344,13 @@ defmodule SetLocaleTest do test "with sibling: it should only assign it" do conn = Phoenix.ConnTest.build_conn(:get, "/en-gb/foo/bar/baz", %{"locale" => "en-gb"}) + |> Plug.Test.init_test_session(@session) |> Plug.Conn.fetch_cookies() |> SetLocale.call(@default_options) assert conn.status == nil assert conn.assigns == %{locale: "en-gb"} + assert get_session(conn, :locale) == "en-gb" assert Gettext.get_locale(MyGettext) == "en-gb" end @@ -350,10 +358,12 @@ defmodule SetLocaleTest do conn = Phoenix.ConnTest.build_conn(:get, "/nl/foo/bar/baz", %{"locale" => "nl"}) |> Plug.Conn.fetch_cookies() + |> Plug.Test.init_test_session(@session) |> SetLocale.call(@default_options) assert conn.status == nil assert conn.assigns == %{locale: "nl"} + assert get_session(conn, :locale) == "nl" assert Gettext.get_locale(MyGettext) == "nl" end @@ -382,10 +392,12 @@ defmodule SetLocaleTest do conn = Phoenix.ConnTest.build_conn(:get, "/fr/foo/bar/baz", %{"locale" => "fr"}) |> Plug.Conn.fetch_cookies() + |> Plug.Test.init_test_session(@session) |> SetLocale.call(@default_options_with_additional_locales) assert conn.status == nil assert conn.assigns == %{locale: "fr"} + assert get_session(conn, :locale) == "fr" assert Gettext.get_locale(MyGettext) == @default_locale end end