我在调整生成的站点 (yesod init) 以使用 I18N 时遇到问题。具体来说,我试图在使用 _{Msg...}
生成的 default-layout-wrapper.hamlet 文件中使用本地化字符串。我已将 Foundation.hs 更改为:
ihamletToRepHtml $(ihamletFile "templates/default-layout-wrapper.hamlet")
但我收到以下错误:
The function `pageHead' is applied to three arguments,
but its type `PageContent url0 -> HtmlUrl url0' has only two
In a stmt of a 'do' expression:
pageHead pc _mrender[a522] _urender[a521]
我还没有触及页面内容创建,它说:
pc <- widgetToPageContent $ do
$(widgetFile "normalize")
addStylesheet $ StaticR css_bootstrap_css
$(widgetFile "default-layout")
所以看起来我需要修改 hamlet 模板中的 pc 创建代码或调用代码(例如
<title>#{pageTitle pc}
的代码),但我不知道如何,并通过 API 文档和各种教程和博客帖子没有给我答案(它可能在那里,但我错过了)。任何想法?
谢谢!
最佳答案
我认为你可以定义一个函数,如:
toHtmlUrlI hu _msgRender urlRender = hu urlRender
然后在
default-layout-wrapper.hamlet
中,将 pageHead
的嵌入替换为:^{toHtmlUrlI $ pageHead pc}
发生的情况是,由于您使用的是 ihamlet,因此嵌入的模板应为以下类型:
type HtmlUrlI18n msg url = Translate msg -> Render url -> Html
然而,
pageHead pc
实际上是这样的:type HtmlUrl url = Render url -> Html
所以你必须忽略那个
Translate msg
参数。顺便说一句,我认为您可以使用
const
代替 toHtmlUrlI
,但我发现后者更清晰一些。关于yesod - 哈姆雷特文件和 18N,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10854467/