檢視原始程式碼 使用 Gettext 進行國際化

若要使用 Gettext 進行國際化,您必須在 LiveView mount 回應中呼叫 Gettext.put_locale/2,以指示 LiveView 應使用哪個地區設定來呈現頁面。

但是,必須回答的第一個問題是如何取回地區設定。有很多方法可以解決這個問題

  1. 地區設定可以作為參數儲存在 URL 中
  2. 地區設定可以儲存在階段中
  3. 地區設定可以儲存在資料庫中

我們將簡要說明這些方法以提供一些方向。

從參數取得地區設定

您可以說所有 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 根據使用者偏好的語言環境變更。希望這份指南對您前進和探索應用程式的最佳方法有一些建議。