Old/sampou.org/Yesod_Internationalization

Yesod_Internationalization

Yesod:Internationalization


国際化

Yesod 0.8から多言語対応(言語カタログ的なもの)をサポートしてくれている。 使い方は簡単。

準備

まずアプリのソースMyApp.hsにMultiParamTypeClasses言語拡張を付ける。

{-# LANGUAGE MultiParamTypeClasses #-}

モジュールをインポートしておく。

import Text.Hamlet.NonPoly (IHamlet, ihamletFile)

このihamletFileがhamletFileの国際化版。 また、hamletToRepHtmlとかの国際化版であるihamletToRepHtmlというのもある。

mkMessage

次にmkMessageする。 こいつはStaticFilesなんかと似たようなものみたい。

mkMessage "MyApp" "messages" "en"

とかする。引数はアプリの名前、メッセージファイルを置くディレクトリ、デフォルト言語かな。 これやると勝手にMyAppMessageという型が出来るっぽい。 ハンドラとかはMyAppをインポートしてると思うのでexportリストに追加。

     :
  , MyAppMessage (..)
     :

ihamletFile,ihamletToRepHtml

例えば、MyAppのYesod instance宣言で

    defaultLayout widget = do
        mmsg <- getMessage
        pc <- widgetToPageContent $ do
            widget
            addCassius $(Settings.cassiusFile "default-layout")
        ihamletToRepHtml $(ihamletFile "hamlet/default-layout.hamlet")

こんな感じにihamlet*に書き換える。 ファイルパスは相対でしかもフルネームで(つまり拡張子を付けて)指定する。 hameltの中は次のようにする。

!!!
<html
    <head
        <title>#{pageTitle pc}
        ^{const $ pageHead pc}
    <body
        $maybe msg <- mmsg
            <div #message>#{msg}
        <div> _{MsgXxx}
        <div> _{MsgYyy}
        ^{const $ pageBody pc}

使う場合の記法としては_{MsgHoge}という風に_(アンダースコア)を先頭に付けてから、 カーリーブレースで式を囲めば良い。 プレフィックスとしてMsgを付ける必要があるので注意。 この様に書いておくと、上の方でmkMessageの第二引数で指定したフォルダ中で、 ja.msgとかen.msgとかのファイルを用意しておけば適当に置換してくれるっぽい。 なお、国際化版では{pageHead pc}とか{pageBody pc}は {const $ pageHead pc}のように書き換えること。

メッセージカタログファイル

ちなみにja.msgファイルは

Xxx: ほげほげ
Yyy: フガフガ

とか書いておけばXxxがMsgXxxとしてhamlet中で参照できる。

あと、引数を取るようなケースはこうやる。

WelcomeUser [email protected]: ようこそ #{name}

hamletの中では普通に#{}なんかと同様に引数に渡せばいい。

<div>_{MsgWelcomeUser $ userFullName u}

Last modified : 2011/06/07 14:37:47 JST