WebSurfer's Home

Filter by APML

カレンダーの表示

by WebSurfer 23. May 2010 21:56
修正前のウィジェットのカレンダー

ウィジェットのカレンダーは、デフォルトでは左の写真のように、(1) 月曜日から始まる、(2) 曜日が二文字になる、(3) タイトルが "5月 2010" のようになります。

日本人にはあまりなじみのない表示で、イマイチ気に入らないので、修正してみました。

修正した結果がウィジェット(左サイドのパネル)の中に表示されているカレンダーです。

上記 (1) および (2) の原因は、\widgets\Calendar\widget.ascx で PostCalendar(Calendar コントロールを継承したカスタムコントロール)の FirstDayOfWeek, DayNameFormat プロパティがそれぞれ Monday, FirstTwoLetters となっているからです。

それを直接書き換えて、Sunday, FirstLetter とすれば (1), (2) の問題は解決します。 でも、国際化対応を考えて(笑)、ブラウザの言語設定が ja-JP または ja の時のみ対応するようにしました。

具体的には、\widgets\Calendar\widget.ascx.cs の LoadWidget メソッドに以下のコードを追加しました。

System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; if (ci.Name == "ja-JP" || ci.Name == "ja") { this.PostCalendar1.DayNameFormat = DayNameFormat.FirstLetter; this.PostCalendar1.FirstDayOfWeek = FirstDayOfWeek.Sunday; }

そうすると、カレンダーの表示幅が狭くなってしまうので、\widgets\Calendar\widget.ascx で PostCalendar.Width プロパティを設定して調整しました。

上記 (3) の原因は、\App_Code\Controls\PostCalendar.cs でタイトル行をレンダリングする時 VisibleDate.ToString("MMMM yyyy") としているからです。

その部分を以下のように変更しました。

//writer.Write("</td><td style=\"text-align:center;width:100px\">" + // VisibleDate.ToString("MMMM yyyy") + // "</td><td align=\"right\">"); // 上記のコードを以下のように変更 System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; if (ci.Name == "ja-JP" || ci.Name == "ja") { writer.Write("</td><td style=\"text-align:center;width:100px\">" + VisibleDate.ToString("yyyy年M月") + "</td><td align=\"right\">"); } else { writer.Write("</td><td style=\"text-align:center;width:100px\">" + VisibleDate.ToString("MMMM yyyy") + "</td><td align=\"right\">"); }

ウィジェットのカレンダーの中にある "View posts in large calendar" というリンクをクリックすると大きなカレンダーが表示されるのですが、 それには上記 (1), (2), (3) の問題はありません。

何故なら、FirstDayOfWeek, DayNameFormat プロパティはデフォルトになっており、 タイトル行は Calendar コントロール自体ものを表示(ShowTitle プロパティを true に設定)しているからです。

ウィジェットのカレンダーの方で、わざわざデフォルトを変更しているのは何か理由があって、それをいじると予期せぬ副作用があるかもしれませんので、しばらく注意して様子を見たいと思っています。

Tags:

BlogEngine.NET

日付表示の変更(2)

by WebSurfer 21. May 2010 00:00

先の投稿 日付表示の変更(1) で、日付の表示について「"yyyy年MM月dd日 HH:mm" としなかったのは、国際化対応にこだわったからです。」などと書いたのですが、結局 "2010年5月1日 12:00" 形式にしました。

今までの形式 "2010/05/01 12:00" では、日本語表示としてはどうしてもイマイチに思えたものですから。(汗)

でも、国際対応にはまだこだわっていて(笑)、ブラウザの言語の設定が日本語(ja-JP または ja)の時のみ "2010年5月1日 12:00" 形式とし、それ以外のときは BlogEngine のデフォルトの "d. MMMM yyyy HH:mm" 形式になるようにしました。

具体的には、PostView.ascx, CommentView.ascx で以下のようにしています(下記は PostView.ascx の場合です)。

<script runat="server"> protected void Page_PreRender(object sender, EventArgs e) { System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; if (ci.Name == "ja-JP" || ci.Name == "ja") { Label1.Text = Post.DateCreated.ToString("yyyy年M月d日 HH:mm"); } else { Label1.Text = Post.DateCreated.ToString("d. MMMM yyyy HH:mm"); } } </script> <div class="post xfolkentry" id="post<%=Index %>"> <h1> <a href="<%=Post.RelativeLink %>" class="taggedlink"> <%=Server.HtmlEncode(Post.Title) %> </a> </h1> <span class="author"> by <a href="<%=VirtualPathUtility.ToAbsolute("~/") + "author/" + BlogEngine.Core.Utils.RemoveIllegalCharacters(Post.Author) %>.aspx"> <%=Post.AuthorProfile != null ? Post.AuthorProfile.DisplayName : Post.Author %> </a> </span> <asp:Label ID="Label1" runat="server" CssClass="pubDate"></asp:Label> ・・・後略・・・

ブラウザで、言語の設定を変えると表示が変わります。IE8 ですと、[インターネットオプション]→[全般]タブ →[言語(L)]→[言語の優先順位]ダイアログで言語の設定を変えられますので、興味のある方はお試しください。

他に、カレンダーについても日本語の場合の表示を変更しました。その話は別途アップします。

Tags:

BlogEngine.NET

日本語の文字化けの問題(2)

by WebSurfer 19. May 2010 22:24
[WebResource.axdを圧縮] の設定

先の投稿 日本語の文字化けの問題(1) で書きました [WebResource.axdを圧縮] にチェックを入れると日本語が文字化けする問題に対応しました。

原因は、BlogEngine.Core の Web\HttpModules フォルダの中にある HTTP モジュール CompressionModule.cs で、Encoding.Default でバイト列を文字列に変換し、文字列を処理した後、 再び Encoding.Default で文字列をバイト列に戻しているところでした。

MSDN ライブラリによると、Encoding.Default は "オペレーティング システムの現在の ANSI コード ページのエンコーディングを取得します" とのことで、 サーバーの OS のデフォルトの Encoding になるようです。自分が使っているホスティングサービス会社のサーバーは日本にあるので、Encoding.Default は Shift_JIS になるようです。

一方、実際の Encoding は UTF-8 であるため、Encoding.Default での変換で情報が失われて文字化けしてしまうようです。

web.config の globalization 要素の requestEncoding, responseEncoding を Shift_JIS にすると文字化けがなくなるという話を Web で見ますが、そういう理由のようです。

正しい解決方法は、CompressionModule.cs で使われている Encoding.Default を実際に使用されている Encoding にすることだと思われます。

WebResourceFilter クラスの Write メソッドの中に 2 ヶ所問題の部分がありますが、それを以下のように変更してみました。

public override void Write(byte[] buffer, int offset, int count) { //string html = System.Text.Encoding.Default.GetString(buffer); string html = HttpContext.Current.Response.ContentEncoding.GetString(buffer);      ・・・中略・・・ //byte[] outdata = System.Text.Encoding.Default.GetBytes(html); byte[] outdata = HttpContext.Current.Response.ContentEncoding.GetBytes(html); _sink.Write(outdata, 0, outdata.GetLength(0)); }

とりあえず、上の写真のように [WebResource.axdを圧縮] にチェックを入れても文字化けはしなくなりました。このまましばらく様子を見たいと思います。

Tags:

BlogEngine.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。ブログ2はそれ以外の日々の出来事などのトピックスになっています。

Calendar

<<  June 2025  >>
MoTuWeThFrSaSu
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

View posts in large calendar