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 diff --git a/lib/set_locale.ex b/lib/set_locale.ex index d55b376..e167477 100644 --- a/lib/set_locale.ex +++ b/lib/set_locale.ex @@ -38,7 +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) + 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