2016-02-16 167 views
4

我正在開發使用鳳凰框架鳳凰本地化

至今一個多語種的應用,路由器這個樣子的:

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

而且爲了使「語言環境」在應用程序中保留,我使用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 -而如何使範圍 「/」將被重定向到範圍 「/:區域設置」與像一個默認值:「恩」

編輯

我喜歡這個URL: 「example.com/en」

凱恩

+1

這可能有助於http://sevenseacat.net/2015/12/20/i18n-in-phoenix-apps.html –

+0

謝謝Sasha,我之前檢查過它,但它沒有回答我的問題。 – kayne

+0

這非常有趣。還必須處理排序規則?我想知道如何解決這個問題。 – helcim

回答

1

我是新來的鳳凰城和ELIXIR自己,但在我看來,一個插件將是您的第二個問題的完美解決方案。使用一個插件來修改連接,例如重定向到/:locale。如何使用Plugs重定向描述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 

當涉及到一個插頭this blog article重定向也是很短的和有用的資源。

我希望有幫助!