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 に設定)しているからです。
ウィジェットのカレンダーの方で、わざわざデフォルトを変更しているのは何か理由があって、それをいじると予期せぬ副作用があるかもしれませんので、しばらく注意して様子を見たいと思っています。
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)]→[言語の優先順位]ダイアログで言語の設定を変えられますので、興味のある方はお試しください。
他に、カレンダーについても日本語の場合の表示を変更しました。その話は別途アップします。
by WebSurfer
19. May 2010 22:24
先の投稿 日本語の文字化けの問題(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を圧縮] にチェックを入れても文字化けはしなくなりました。このまましばらく様子を見たいと思います。