凤凰本地化

kay*_*yne 5 elixir phoenix-framework

我正在使用Phoenix框架开发多语言应用程序

到目前为止,路由器看起来像这样:

scope "/:locale", App do
    pipe_through [:browser, :browser_session]

    get "/", PageController, :index

    get  "/otherpage", OtherpageController, :index
end

scope "/", App do

end
Run Code Online (Sandbox Code Playgroud)

我在文档中使用了插件:http : //www.phoenixframework.org/docs/understanding-plug#section-module-plugs

为了使“语言环境”在应用程序中持久存在,我在Phoenix.Controller模块中使用了自定义操作来执行此操作:

def action(conn, _) do
    apply(__MODULE__, action_name(conn), [conn,
                                    conn.params,
                                    conn.assigns.locale])
end
Run Code Online (Sandbox Code Playgroud)

因此,现在每次生成控制器时,都应该添加上述自定义操作,并更改新控制器中的每个操作以注入区域设置

def index(conn, _params, locale) do
    list = Repo.all(List)

    render conn, "index.html", list: list
end
Run Code Online (Sandbox Code Playgroud)

我正在努力解决两件事:

1-这是正确的方法吗?还是我在弄东西?

2-以及如何使范围“ / 使用默认值重定向到范围“ /:locale”,例如:“ en”

编辑

我喜欢使用以下网址:“ example.com/en”

凯恩

SSc*_*eid 2

我本人是 Phoenix 和 Elixir 的新手,但在我看来,Plug 是解决你的第二个问题的完美解决方案。使用插件修改 conn 例如重定向到/:locale. Phoenix 文档中描述了如何使用 Plugs 进行重定向。我复制了以下本地化插件的重定向部分:

defmodule HelloPhoenix.Plugs.Locale do
  import Plug.Conn

  @locales ["en", "fr", "de"]

  def init(default), do: default

  def call(%Plug.Conn{params: %{"locale" => loc}} = conn, _default) when loc in @locales do
    assign(conn, :locale, loc)
  end
  def call(conn, default), do: assign(conn, :locale, default)
end

defmodule HelloPhoenix.Router do
  use HelloPhoenix.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
    plug HelloPhoenix.Plugs.Locale, "en"
  end
Run Code Online (Sandbox Code Playgroud)

当谈到使用插件重定向时,这篇博客文章也是一个简短而有用的资源。

我希望这有帮助!