Integrating with Phoenix

You can integrate Idiom with your Phoenix project quite simply.

Importing Idiom

Begin by importing Idiom into your MyAppWeb module which brings in a couple of helper functions used commonly in your views:

defmodule MyAppWeb do
  def html_helpers do
    quote do
      import Phoenix.HTML
      import Idiom
      # ... Other imports
    end
  end
end

User-preferred language

If your user schema includes a preferred_language field (storing a locale string), the put_locale/1 function can be used during mount to set the active language per user's preferred language:

defp mount_current_user(socket, session) do
  Phoenix.Component.assign_new(socket, :current_user, fn ->
    with user_token when not is_nil(user_token) <- session["user_token"],
         %Accounts.User{} = user <- Accounts.get_user_by_session_token(user_token) do
      Idiom.put_locale(user.preferred_language)
      user
    end
  end)
end

Translations in templates

You can use t/2 and t/3 functions directly in your Phoenix templates:

~H"""
<%= t("Welcome!") %>

<!-- With bindings -->
<%= t("Welcome, {{name}}!", %{name: @current_user.name}) %>
"""

Using namespaces for pages

You can organise your translations using namespaces and set a namespace per page:

def mount(_params, _session, socket) do
    Idiom.put_namespace("signup")

    {:ok, reply}
end

def render(assigns) do
    ~H"""
    <%= t("Create your account") %>
    """
end

Here, the actual translation key becomes "signup.Create your account".