Gettext and liveview

Hi,
I have a web app with default locale: it
I created a liveviewmodule like this:


defmodule ShuttertopWeb.UserFollowLive do
    use ShuttertopWeb, :live_view

def render(assigns) do
      Logger.info("------ #{inspect(Gettext.get_locale(ShuttertopWeb.Gettext))}")
      ~L"""
      <button phx-click="follow" class="<%= if @active, do: "actived" %>">
          <%= if(@active, do: gettext("seguendo"), else: gettext("segui")) %>
      </button>
      """
    end

    def mount(_params, %{"user_id" => user_id, "current_user_id" => current_user_id, "active" => active}, socket) do

      socket =
        socket
        |> assign(%{
          active: active,
          current_user_id: current_user_id,
          user_id: user_id,
        })
      {:ok, socket, layout: false}
    end

....
end

If i launch my site using an user with locale: en, the page html is render correctly in english but in few milliseconds the button text changes and become italian text.

This is the log that i put in render method:

info] ------ "en"
[info] Sent 200 in 22ms
[info] CONNECTED TO Phoenix.LiveView.Socket in 249µs
  Transport: :websocket
  Serializer: Phoenix.Socket.V2.JSONSerializer
  Parameters: %{"_csrf_token" => "QTUALCk4NAhdFQgCWVgtLhFrD2EaJQZj-jpOAALj6dDjoahiA4W1Bjl3", "_mounts" => "0", "vsn" => "2.0.0"}
[info] ------ "it"

How can i do to maintain the locale en?

Thanks

1 Like

Just like you likely do in your plug pipeline you’ll need to set the locale for your liveview process as well. Because the first static render of your liveview does happen in the same process as your plug pipeline the locale is retained for the static render. That’s not the case though for any render happening later when the liveview js connects.

2 Likes

There is also a quick guide on the docs showing how to do that: https://hexdocs.pm/phoenix_live_view/using-gettext.html#content

2 Likes

It works, thanks!