AjaxControlToolkit の CalendarExtender でポップアップ表示されるカレンダーについて、特に気を遣わずにそのまま使うと、月の名前や曜日が英語表記になっている。
これを日本語表記にするには、ページに貼り付けてある ToolkitScriptManager の EnableScriptGlobalization プロパティおよび EnableScriptLocalization プロパティのそれぞれが true に変更すればよい。
ここまではFAQレベルということですぐに調べはつく。
しかし、日本語表記にはなったものの、ちょっと違和感を覚える箇所がある。
カレンダーのヘッダが「1月, 2008」、カレンダのフッタが「今日:1月 1, 2008」みたくなっているのだ。
ここはできれば「2008年 1月」とか「今日:2008年 1月 1日」と表示されて欲しいところだ。
Google 検索してみたところ、
DOBON.NET で同じ悩みを投稿された方をみつけたが、特にレスはついていないらしい。
もう少しねばって検索を続けたところ、@IT の会議室にたどりついた。
@IT会議室 > Insider.NET 会議室 > CalendarExtenderコントローラについて
こちらを参照するに、どうやら、CalendarExtender の JavaScript に直接手を入れる以外ないらしい。
たしかに、手元の AjaxControlToolkit ver.3.0.11119 のソース、CalendarBehavior.js をよく読んでみると、どうやら、_performLayout メソッドのなかで localeFormat で日付を文字列に書式化する際に、書式文字列が "MMMM, yyyy" とか "MMMM d, yyyy" とハードコーディングされているところが、今回の問題点であるようだ。
この書式文字列さえ書き替えれば解決できるわけである。
さて、いざとなれば CalendarBehavior.js の変更も辞さないが、AjaxControlToolkit のバージョンアップについていくことを考えると、もうちょっと上手い回避策があるといいものだ。
そこで思いついたのだが、つまり、コイツは JavaScript なのである。動的なのである。ブラウザ上で動作する時点で、CalendarBehavior.js の挙動を書き替えてしまえばよいのではないか?
ということで、下記の JavaScript コードをページロード時に実行するようにした。
var f = AjaxControlToolkit.CalendarBehavior.prototype._performLayout.toString();
f = f.replace('"MMMM, yyyy"','"yyyy年 M月"').replace('"MMMM d, yyyy"','"yyyy年 M月 d日"');
eval("AjaxControlToolkit.CalendarBehavior.prototype._performLayout = "+f);
(
2008/02/04追記 上記コードをコピペする際は、"eval"が全角なので半角英字に書き替えてご利用下さい。)
つまり、オリジナルの _performLayout メソッドの実装を文字列で取得し、書式文字列を置換して書き替えた後、evalでオリジナルの定義を変更してしまうのである。
根本的には、AjaxControlToolkit のローカリゼーションの機能に載せることだが、当座のしのぎにはこれでどうにかなる。