2016-02-16 135 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重定向也是很短的和有用的资源。

我希望有帮助!