我在调整生成的站点 (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/

10-15 12:01