檢視原始程式碼 使用 Gettext 進行國際化
若要使用 Gettext 進行國際化,您必須在 LiveView mount 回應中呼叫 Gettext.put_locale/2
,以指示 LiveView 應使用哪個地區設定來呈現頁面。
但是,必須回答的第一個問題是如何取回地區設定。有很多方法可以解決這個問題
- 地區設定可以作為參數儲存在 URL 中
- 地區設定可以儲存在階段中
- 地區設定可以儲存在資料庫中
我們將簡要說明這些方法以提供一些方向。
從參數取得地區設定
您可以說所有 URL 都有一個地區設定參數。在您的路由器中
scope "/:locale" do
live ...
get ...
end
不帶地區設定地存取頁面應自動重新導向到具有地區設定的 URL (最佳地區設定可以從 HTTP 標頭中取得,這不在本指南的範圍內)。
然後,假設所有 URL 都有一個地區設定,您可以相應地設定 Gettext 地區設定
def mount(%{"locale" => locale}, _session, socket) do
Gettext.put_locale(MyApp.Gettext, locale)
{:ok, socket}
end
您也可以使用 on_mount
掛鉤來自動還原應用程式中每個 LiveView 的地區設定
defmodule MyAppWeb.RestoreLocale do
def on_mount(:default, %{"locale" => locale}, _session, socket) do
Gettext.put_locale(MyApp.Gettext, locale)
{:cont, socket}
end
# catch-all case
def on_mount(:default, _params, _session, socket), do: {:cont, socket}
end
然後,將此掛鉤加入 def live_view
下的 MyAppWeb
,以預設在所有 LiveView 上執行
def live_view do
quote do
use Phoenix.LiveView,
layout: {MyAppWeb.Layouts, :app}
on_mount MyAppWeb.RestoreLocale
unquote(view_helpers())
end
end
請注意,由於未將 Gettext 地區設定儲存在 assigns 中,因此如果您想要變更地區設定,您必須使用 <.link navigate={...} />
,而不是單純地修補頁面。
從階段取得地區設定
您也可以將地區設定儲存在 Plug 階段中。例如,在控制器中,您可能會執行
def put_user_session(conn, current_user) do
Gettext.put_locale(MyApp.Gettext, current_user.locale)
conn
|> put_session(:user_id, current_user.id)
|> put_session(:locale, current_user.locale)
end
然後從您的 LiveView mount 中還原階段的地區設定
def mount(_params, %{"locale" => locale}, socket) do
Gettext.put_locale(MyApp.Gettext, locale)
{:ok, socket}
end
您也可以將其封裝在掛鉤中,如前一節所述。
但是,如果地區設定儲存在階段中,您只能透過使用一般控制器要求來變更地區設定。因此,您應始終使用 <.link to={...} />
來指派變更階段的控制器相應地重新載入所有 LiveView。
從資料庫取得地區設定
您也允許使用者將其地區設定儲存在資料庫中。然後,在 mount/3
中,您可以從階段中取得使用者 ID 並載入地區設定
def mount(_params, %{"user_id" => user_id}, socket) do
user = Users.get_user!(user_id)
Gettext.put_locale(MyApp.Gettext, user.locale)
{:ok, socket}
end
實際上,您可能會混用以上列出的多種方法。例如,資料庫在使用者登入後讀取很方便。但在那之前,您可能需要將語言環境儲存在工作階段或 URL 中。
類似地,您可以在 URL 中保留語言環境,不過在使用者登入後,將 URL 根據使用者偏好的語言環境變更。希望這份指南對您前進和探索應用程式的最佳方法有一些建議。