它是如何在Haskell文件中使用翻译的消息的?

时间:2013-03-21 14:13:25

标签: haskell internationalization yesod

我在互联网上搜索了Yesod Web电子书和其他教程(Yesod Tutorial),但我无法澄清这个问题。我正在使用脚手架网站。

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

  

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

我尝试使用(显示MsgHello)(打包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")

2 个答案:

答案 0 :(得分: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”

答案 1 :(得分:2)

我对I18N模块的理解是,您希望获取AppMessage值并使用renderMessage

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