Localized routes for Elixir Phoenix applications, with and without LiveView.
Multilingual simplifies handling localized routes in Elixir Phoenix applications, with and without LiveView.
When a site is localized, it is important to know which paths should be used for the various localizations of a specific view.
Maybe the "about page" is /about
in English and /it/chi-siamo
in
Italian.
One common need is a "language selector", where you can jump to the same view in another language.
Somewhere, for each localized view, there needs to be a mapping like this:
This library is based on the idea that it is better to put such localization information directly in the router.
Fortunately, the Phoenix.Router allows metadata to be added to route declarations.
With Multilingual, you add metadata to indicate the locale of each localized view.
You can do this via a helper:
import Multilingual.Routes, only: [metadata: 1]
...
get "/", PageController, :index, metadata("zh")
metadata/1
returns the options
for the route, specifically, setting the locale as the metadata for this library.
It's the same if you do this:
get "/", PageController, :index, metadata: [multilingual: %{locale: "zh"}]
Consider these routes:
get "/", PageController, :index, metadata("en")
get "/zh", PageController, :index, metadata("zh")
As they have the same plug
(PageController
) and plug_opts
(:index
),
Multilingual can group them to create the mapping that we need between
localized versions of the same view.
From the above, we can deduce this:
And that's all is needed to carry out all the tasks we need when handling the views of a localized site.
Multilingual places no restrictions on how you structure your router declarations.
You can group the localized versions under scopes, with path prefixes:
scope "/", MyAppWeb do
get "/", PageController, :index, metadata("en")
end
scope "/zh", MyAppWeb do
get "/", PageController, :index, metadata("zh")
end
Otherwise, you can group the localized versions of a view together:
scope "/", MyAppWeb do
get "/", PageController, :index, metadata("en")
get "/zh", PageController, :index, metadata("zh")
end
If the path itself is localized, it's easy to follow what's going on:
scope "/", MyAppWeb do
get "/about", PageController, :index, metadata("en")
get "/it/chi-siamo", PageController, :index, metadata("it")
end
mix multilingual.routes
If you want to check how your localized routes are configured, there is a Mix task:
$ mix multilingual.routes
method module action en it
get MyAppWeb.PageController :index /about /it/chi-siamo
With you routes set up, you can then make use of the information they give via the following modules and functions.
This works by first storing the current path and locale
(the 'View')
in the conn
or ,for LiveView, the socket
and then using that
information to take further actions.
Gettext.put_locale/1
.Gettext.put_locale/1
.