いけがみです。
今週末の LL weekend でみなさんとお会いできるのを楽しみにしております。

最近、 wxHaskell の ver 0.8 がでましたね。
variable が付け加わったことで、
よりいっそう書きやすくなったのではないかと思います。
# より手続き型っぽく書けるようになったのはいいことか?

前回のメールで、wxHaskell のソースコードを直接書きかえて、
日本語のカタログを出す方法を紹介しましたが、
実はソースコードの書き換えは不要だということに気が付いたので報告します。
(カタログを利用するインターフェースはすでにありました)

それから、 wxWidgets, wxHaskell のテキストフィールドで
日本語の入出力を取り扱うのはうまくいきました。

確かめた環境は、
  (1) Linux
      wxWidget  -- wxGTK version 2.4.2
      wxHaskell -- version 0.7
  (2) Windows with MinGW (not Cygwin)
      wxWidget  -- wxMSW version 2.4.2
      wxHaskell -- version 0.8
です。手元に、MacOSX と wxHaskell の環境もあるのですが、
locale 周りを実験したところでは、全然だめでした。
# というか、 MacOSX の上では wxWidgets も wxHaskell も
# いろいろな不具合があります。まだ開発途中なのでしょう。

日本語カタログを用いて日本語を表示する方法は、
  (i) 以下のサンプルコードのように、
      initLocale :: IO ()
      translatedString :: String -> String
      を定義する
  (ii) アプリケーションと同じディレクトリに
         ja/
       というディレクトリを作る
  (iii) ja/ に "アプリケーション名.po" を GNU gettext の
       作法で書く。このとき、
       wxGTK なら、漢字コードは EUC-JP,
       wxMSW なら、漢字コードは SHIFT-JIS で書くこと。
  (iv)  ディレクトリ ja/ に "アプリケーション名.mo" を作る。
       作り方は、
       % msgfmt -o アプリケーション名.mo アプリケーション名.po
  (v)  アプリケーションのあるディレクトリに change directory して、
       実行する

手順 (v) は localeAddCatalogLookupPathPrefix を使えば、
不要になるはずなのですが、手元ではまだうまくいっていません。
(おかしいなあ)

このメールには載せませんが、下の例で日本語を出すには、
3 つの文字列 "show dialog", "error", "test" の
翻訳カタログが必要です。

-- a sample of error dialog
-- 
import Ptr
import CString
import Monad
import Graphics.UI.WXCore
import Graphics.UI.WX

main = start $ do
  initLocale
  f <- frame []
  s <- translatedString "show dialog"
  b <- button f [on command := push f, text := s]
  set f [layout := widget b]
  return ()

push f = 
    do title <- translatedString "error"
       msg   <- translatedString "test"
       errorDialog f title msg
       return ()

initLocale :: IO ()
initLocale =
    do locale <- localeCreate 0 0
       name   <- wxcAppGetAppName >>= newCString
       localeAddCatalog locale name
       return ()

translatedString :: String -> IO String
translatedString str =
    (liftM castPtr) (getELJTranslation str) >>= peekCString

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/