我正在使用Phoenix Framework开发多语言应用程序
到目前为止,路由器看起来像这样:
scope "/:locale", App do
pipe_through [:browser, :browser_session]
get "/", PageController, :index
get "/otherpage", OtherpageController, :index
end
scope "/", App do
end
我使用了文档中的插件:http://www.phoenixframework.org/docs/understanding-plug#section-module-plugs
制作" locale"在应用程序中持久化,我使用Phoenix.Controller模块中的自定义操作来执行此操作:
def action(conn, _) do
apply(__MODULE__, action_name(conn), [conn,
conn.params,
conn.assigns.locale])
end
所以现在我每次生成一个控制器时都应该添加上面的自定义操作,并更改新控制器中的每个操作以注入区域设置
def index(conn, _params, locale) do
list = Repo.all(List)
render conn, "index.html", list: list
end
我挣扎的有两件事:
1 - 这是正确的方法吗?或者我弄乱了什么?
2 - 以及如何将范围" /" 重定向到范围" /:locale&# 34; ,默认值为:" en" ?
修改
我喜欢这个网址:" example.com/en"
凯恩
答案 0 :(得分:1)
我自己是Phoenix和Elixir的新手,但在我看来,Plug是你第二个问题的完美解决方案。使用Plug将conn修改为例如重定向到/:locale
。如何使用插件进行重定向的描述in the Phoenix documentation here。我在下面复制了本地化插件部分的重定向:
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
使用Plug this blog article进行重定向时,这也是一个简短且有用的资源。
我希望有所帮助!