通过控制器中的操作在2个或更多模板之间切换?

时间:2017-07-28 19:10:40

标签: html elixir phoenix-framework

我有一个默认的Phoenix应用程序。这个应用程序将有一个page_controller 这将加载index.html.eex文件。

该应用知道使用view访问templates/page/index.html.eex

现在说你已经创建了另一个html页面,除了法语之外,它在各个方面都与index.html.eex相同。

因为我们不想创建一个全新的Phoenix应用程序,它将具有所有相同的代码,除了当前page/index.html.eex的法语翻译,有没有办法告诉 视图或控制器需要加载哪个文件。

是否有插头可放置在路由器中以改变render寻找模板的位置?

2 个答案:

答案 0 :(得分:0)

首先,我建议您使用Gettext为法语页面使用标签。

例如,您可以将所有法语模板保存在完全相同的文件夹中(不要更改视图的逻辑),但要使用后缀命名,例如。 “index_fr.html.eex”等然后你就可以编写非常简单的帮助器(不一定是插件),它会将这个后缀添加到你的所有模板中。

不过,我建议你使用Gettext - 模板的源代码只是到位,几乎所有的逻辑Gettext都为你处理。

答案 1 :(得分:0)

我建议你选择@ patnowak的答案。使用Gettext,这是用于翻译的工具,功能强大。

如果您仍想这样做,请记住视图中定义的控制器调用render/3函数中的render/2(如果已定义)。如果没有,它运行默认渲染功能并查找模板。请阅读docs以获取更多信息。

例如,这是控制器:

def index(conn, params) do
  # defined assigns as you wish
  render(conn, "index.html", assigns)
end

现在,在视图中定义:

def render("index.html, assigns) do
  case assigns[:lang] do
    "fr" -> render("index_fr.html", assigns)
    _others -> render("index_en.html", assigns)
  end
end

您也可以编写一个插件来自动将:lang放入分配中:

def lang_plug(conn, opts) do
  conn
  |> fetch_query_params()
  |> (fn cn -> assign(cn, :lang, cn.query_params[:lang] || "en").()
end

查看Plug.Conn以查看fetch_query_params/1assign/3的文档,以及从其他位置(如标题或正文)获取语言的其他函数。

你明白了。在插件中,fill分配:lang,在定义的渲染函数中获取它们并采取适当的行动。

仍然,不要这样做。使用Gettext是正确的方法。