2012-11-26 3 views
1

message/en.msg 파일처럼 보자열거 AppMessage 생성자

Category1: some text 1 
Category2: some text 2 
    ... 
CategoryN: some text N 

그리고 유효한 다음 코드를 보자

getHomeR :: Handler RepHtml 
getHomeR = do 

    (msg :: AppMessage -> Text) <- getMessageRender 

    let list = T.concat $ map msg [MsgCategory1, MsgCategory7] 

    defaultLayout $ do 
     $(widgetFile "homepage") -- <p>List: #{list} 

다음, listMsgCategory1MsgCategory7 번역이 포함되어 있습니다.

은 좀처럼하고 싶지 :

let list = T.concat $ map msg [MsgCategory1 .. MsgCategory7] 

하지만 AppMessage 파생 Enum가 없습니다.

내 또 다른 하나 개의 대안이 너무 유효하지, 어떻게 "실시간"AppMessage 요소를 캐스팅하는 일반적으로

let list = T.concat $ map (\n -> msg $ read "MsgCategory" ++ show n) [1 .. 7] 

을 (Read도 도출되지 않음)?

대단히 감사합니다!

이 (! 내가 Yesod 사랑 :)) 내가 찾은

답변

0

한 가지 방법은 here

deriving instance Enum AppMessage 
deriving instance Eq AppMessage 
deriving instance Read AppMessage 
deriving instance Show AppMessage 
... 

입니다

는 설명 (-XStandaloneDeriving이 필요) :

변경 Foundation.hs에 :

-- Set up i18n messages. See the message folder. 
mkMessage "App" "messages" "en" 

-- Require extension: StandaloneDeriving 
deriving instance Enum AppMessage 

켜짐 site.cabal :

extensions: TemplateHaskell 
      QuasiQuotes 
      OverloadedStrings 
      NoImplicitPrelude 
      CPP 
      MultiParamTypeClasses 
      TypeFamilies 
      GADTs 
      GeneralizedNewtypeDeriving 
      FlexibleContexts 
      EmptyDataDecls 
      NoMonomorphismRestriction 
      StandaloneDeriving