3

我在 Internet、Yesod Web 电子书和其他教程(Yesod 教程)中进行了搜索,但我无法澄清这个问题。我正在使用脚手架站点。

我有一个处理程序,在它内部返回一个值,如果用户已通过身份验证,则返回电子邮件,否则返回字符串。我想要的是返回本地化消息而不是字符串“(未知用户 ID)”。我的问题是使用消息文件中的值(例如 MsgHello),如果我这样做,它会返回如下错误:

无法匹配预期AppMessage' with actual type的文本类型'

我曾尝试使用(show MsgHello)(pack MsgHello),甚至调用msg <- getMessageRender但我无法做到我所期望的。如果您有任何建议,欢迎提出。

谢谢!!

PD:这是我正在处理的代码的一部分,行:

getUserProfileR :: Handler RepHtml
getUserProfileR = do        
    maid <- maybeAuth
    let user = case maid of
                    Nothing -> "(Unknown User ID)"
                    Just (Entity _ u) -> userEmail u
    defaultLayout $ do
        setTitleI MsgUserProfile
        $(widgetFile "nhUserProfile")
4

2 回答 2

3

感谢 Tickhon Jelvis 指出这些网页,我还找到了这个:Poly Hamlet i18n,在那里我能够找到问题的解决方案。

因此,如果我想使用本地化消息,我会这样做:

getUserProfileR :: Handler RepHtml
getUserProfileR = do        
    maid <- maybeAuth
    msg <- getRenderMessage
    let user = case maid of
                    Nothing -> msg MsgNoUser --"(Unknown User ID)"
                    Just (Entity _ u) -> userEmail u
    defaultLayout $ do
        setTitleI MsgUserProfile
        $(widgetFile "nhUserProfile")

还要记住,有一个帮助函数“setTitleI”,它直接接受一个 Msg 值并避免使用“msg MsgThisPageTitle”

于 2013-04-03T02:51:21.867 回答
2

我对I18N模块的理解是你想把你的AppMessage价值用renderMessage在它上面。

您需要传入一个类型,指定您的翻译类型和语言列表以及您的消息。翻译类型是使用mkMessage函数创建的,语言列表类似于["en-US", "en-GB", "fr"].

于 2013-03-21T16:55:43.080 回答