LiveView not rerendering after change in locale

I have a LiveView that has localized content using gettext, upon first rendering the text appears in the correct language. I have a couple of .links that patch the locale using handle_params/3. Sadly this doesn’t work, LV does not rerender the localised text.

  def handle_params(%{"locale" => locale}, _uri, socket) when locale in @locales do
    Gettext.put_locale(locale)

    IO.inspect(Gettext.get_locale(), label: "locale")

    {:noreply,
     socket
     |> assign(locale: locale)}
  end

The IO.inspect shows the changed language, I even assign it to the socket.
And this is my render/1

  @impl true
  def render(assigns) do
    ~H"""
    <article class="mx-auto max-w-lg">
      <section class="conditions bg-white shadow-md rounded leading-relaxed px-6 text-sm mb-6 py-2">
        <p class="my-1">
          <%= Gettext.with_locale(@locale, fn ->
            gettext("You have successfully connected to the internet!")
          end) %>
        </p>
        <p class="mb-1">
          <%= gettext("Your session started on") %> <%= format_datetime(@session.started, @hotspot) %>,<br />
          <%= gettext("and will end on") %> <%= format_datetime(@session.ends, @hotspot) %>.
        </p>
      </section>
    </article>
    """
  end

The first text will be translated, the 2 others remain the same.
I tried with putting the with_locale/2 around the whole content, but then nothing changes.

I know I can change the patch to navigate, but as the links are in the layout the other params get lost.

What am I missing?

ELixir 1.17.0-rc-1 / Erlang 27.0 / phoenix_live_view 0.20.14

Okay shoot, every time. You find a solution after you post.

I need to specify it like this gettext("and so on", locale: @locale) then LV updates it.

5 Likes