我有一个默认的Phoenix应用程序。这个应用程序将有一个page_controller
这将加载index.html.eex
文件。
该应用知道使用view
访问templates/page/index.html.eex
。
现在说你已经创建了另一个html页面,除了法语之外,它在各个方面都与index.html.eex
相同。
因为我们不想创建一个全新的Phoenix应用程序,它将具有所有相同的代码,除了当前page/index.html.eex
的法语翻译,有没有办法告诉
视图或控制器需要加载哪个文件。
是否有插头可放置在路由器中以改变render
寻找模板的位置?
答案 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/1
和assign/3
的文档,以及从其他位置(如标题或正文)获取语言的其他函数。
你明白了。在插件中,fill分配:lang
,在定义的渲染函数中获取它们并采取适当的行动。
仍然,不要这样做。使用Gettext是正确的方法。