WebSurfer's Home

トップ > Blog 2   |   ログイン
APMLフィルター

ページャーの設定変更

by WebSurfer 2015年9月21日 13:04

記事数が増えてきて、画面の下の方に表示されるページャーの表示が下の画像のように崩れるので、設定を変更しました。どのように変更したかを備忘録として書いておきます。

ページャー

具体的にはページャーに表示されるページの数を減らしました(上の画像で言うと、99 と 107 の 2 つを減らしました)。

その数字は App_Code/Controls/PostPager.cs で MaxPages = 12 としてハードコーディングされており、それを 10 に変更しました。

変更は以下のコードに示すように 1 行だけで済みます。ただし、該当箇所を探すのと、ソースを修正してサーバーの PostPager.cs と差し替えなければならないのがちょっと面倒かも。

private static IEnumerable<int> PageList(int total, int current)
{
    var pages = new List<int>();
    var midStack = new List<int>();
            
    // should be more then 4
    // 2015/9/21 記事数が増えページャーの幅が広がって表示が
    // 崩れるので初期値 12 を 10 に変更。
    const int MaxPages = 10;

    if (MaxPages > total)
    {
        for (var i = 1; i <= total; i++)
        {
            pages.Add(i);
        }
    }
    else
    {
        const int Midle = (MaxPages - 4) / 2;

        // always show first two
        pages.Add(1);
        pages.Add(2);

        // ・・・中略・・・

        // always show last two
        pages.Add(total - 1);
        pages.Add(total);
    }

    return pages;
}

なお、ブログ1(BlogEngine.NET 1.6.1 を使用)のページャーも ページャーの移植 で書きましたようにページャーだけブログ2のものに差し替えており、それもついでに変更しました。

Tags:

BlogEngine.NET 2.0

国際化の不具合の修正

by WebSurfer 2015年9月6日 15:06

約 2 年ぶりの BlogEngine.NET 2.0 の不具合修正の話です。

BlogEngine は国際化対応がされていて、ブラウザの言語指定に応じてリソースファイルの自動切り替えが行われ、ラベルに表示される文字列の言語が変わります。

例えばブラウザが IE の場合、言語の優先順位の設定を下の画像のように日本語を最優先にしておくと、アプリケーションルート直下の App_GlobalResources フォルダにある日本語のリソースファイル labels.ja.resx からラベルに表示する文字列を取得して設定します。

IE の言語の優先順位の設定

(詳しい仕組みに興味がありましたら、別の記事 aspx ページでのリソースの利用 を見てください)

ところが、ブログ2で使用している BlogEngine.NET 2.0 の場合、レーティングや APML フィルターのラベルの国際化対応にバグがあるらしく、下の画像で赤枠で囲った部分のように英文になってしまいます。(ちなみに、ブログ1で使用している BlogEngine.NET 1.6.1 の場合はこの問題ありません)

国際化の不具合

ブログ2開設当時からこの問題には気づいていたのですが、原因を探すのが面倒だったし、致命的な問題ではないので放置してきました。(汗)

何年も放置しておいて今さらなんですが、やっぱり気になるので修正しました。ブラウザの言語設定が日本語になっていれば、レーティングのラベル部分も日本語で表示されているはずです。ブラウザの設定で英語とかフランス語を最上位に持ってくれば、その言語で表示されるはずです。

どこが問題だったか、どのように修正したかを以下に備忘録として書いておきます。

最初は App_GlobalResources フォルダにあるリソースファイルの問題かと思っていましたが、リソースファイルはこの問題のないバージョン 1.6.1 のものと同じでした。ということは、リソースを取得する方法に問題があるということになります。

レーティングの表示は、バージョン 1.6.1, 2.0 いずれも blog.js という名前の外部スクリプトファイルを読み込んで、その中の showRating, applyRatings というメソッドで html ソースを生成しています。

その際、ラベルに表示する文字列は、BlogEngine.i18n.beTheFirstToRate とか BlogEngine.i18n.currentlyRated という変数に定義されます。この定義の仕方がバージョン 1.6.1 と 2.0 とでは異なっています。

バージョン 1.6 では BlogBasePage クラスに AddLocalizationKeys というメソッドがあり、これにより BlogEngine.i18n.beTheFirstToRate 等の変数定義をインラインでページに書き込んでいます。書き込む際、GetGlobalResourceObject メソッドを利用して、ブラウザの言語設定に従って自動的に正しいリソースファイルを選択して文字列を取得しているので、正しい言語の文字列が変数に設定されます。

バージョン 2.0 ではこの部分が異なっていて、1.6.1 のようにページに変数定義をインラインで埋め込むのではなく、BlogBasePage クラスの Utils.AddJavaScriptResourcesToPage(this); によって、以下のような外部スクリプトファイルとして定義されます。(キャッシュを利用できるようにするため)

<script 
  type="text/javascript" 
  src="http://surferonwww.info/BlogEngine2/res.axd?lang=en-gb">
</script>

問題は、上記 src 属性に設定される url のクエリ文字列 lang=en-gb です。この en-gb は BlogSettings.Instance.Language から取得していますが、ブラウザの言語設定に関係なく常に "en-GB" になってしまいます。

HTTP ハンドラ res.axd(ResourceHandler.cs に定義されている)はクエリ文字列を見て、これに該当するリソースファイルから文字列を取得します。クエリ文字列は常に lang=en-gb なので、レーティング等に表示されるラベルは常に英語になってしまいます。

修正は AddJavaScriptResourcesToPage メソッドで BlogSettings.Instance.Language を使用せず、Thread.CurrentUICulture プロパティで現在のカルチャを取得して設定するようにしました。

具体的には以下の通りです。

Utils.cs の AddJavaScriptResourcesToPage メソッド

public static void AddJavaScriptResourcesToPage(Page page)
{
  // BlogSettings.Instance.Language は "en-GB" になってしまい、
  // ブラウザの言語設定が反映されない。結果レーティング等に表示
  // される文字列が英語で固定となってしまう。
  // var resourcePath = 
  //    Web.HttpHandlers.ResourceHandler.GetScriptPath(
  //        new CultureInfo(BlogSettings.Instance.Language));

  // それを以下のように修正:
  CultureInfo ci = 
      System.Threading.Thread.CurrentThread.CurrentUICulture;
  string resourcePath = 
      Web.HttpHandlers.ResourceHandler.GetScriptPath(ci);

  var script = string.Format(
      "<script type=\"text/javascript\" src=\"{0}\"></script>", 
      resourcePath);
  page.ClientScript.RegisterStartupScript(
      page.GetType(), 
      resourcePath.GetHashCode().ToString(), 
      script);
}

その他、この修正に伴って、日本語にすると AMPL の入力窓の幅が不足して表示が崩れる問題が出ましたので、blog.js の filterByAPML: function () の中の div.style.width = '400px'; を 450px に変更しました。(マイナーな問題ですが忘れないように書いておきます)

Tags:

BlogEngine.NET 2.0

「アーカイブ」ページの修正

by WebSurfer 2013年7月31日 12:20

久々の BlogEngine.NET 2.0 の不具合修正の話です。

「アーカイブ」ページのメニュー

「アーカイブ」のページには、上の画像(IE9 とその開発者ツールを重ねて表示)のようにページの上部にハイパーリンク(html の a 要素)でメニューが表示され、これをクリックすると同じページ内の一覧のヘッダまでスクロールするようになっています。

その仕掛けは、上の画像の開発者ツールの html コードを見てください。例えば、メニューの a 要素で href="#cat-AKB48" と設定し、一覧のヘッダの h2 要素で id="cat-AKB48" と設定されているのが分かるでしょうか。

上の画像の html コードは修正後のものなので a 要素の href も h2 要素の id も正しく設定されていますが、修正前は a 要素の href が "#AKB48" となっていた(cat- がない)という不具合がありました。

それを以下のように cat- を追加するようにして修正しました。

archive.aspx.cs の AddCategoryToMenu メソッド

public partial class archive : 
    BlogEngine.Core.Web.Controls.BlogBasePage
{

  // ・・・中略・・・

  private void AddCategoryToMenu(string title)
  {
    HtmlAnchor a = new HtmlAnchor();
    a.InnerHtml = Server.HtmlEncode(title);

    // 2013/7/31 修正
    // バージョン 2.0 の CreateRowHeader メソッドで、
    //
    // h2.Attributes["id"] = 
    //   "cat-" + Utils.RemoveIllegalCharacters(name);
    //
    // と cat- をカテゴリー名の頭に追加したにもかかわらず、
    // ここでは cat- を追加してないので、メニューをクリック
    // しても動かないという不具合あり。以下のように修正:
    //
    // a.HRef = "#" + Utils.RemoveIllegalCharacters(title);
    //          ↓
    a.HRef = "#cat-" + Utils.RemoveIllegalCharacters(title);

    a.Attributes.Add("rel", "directory");

    HtmlGenericControl li = new HtmlGenericControl("li");
    li.Controls.Add(a);
    ulMenu.Controls.Add(li);
  }

  // ・・・中略・・・

}

Tags:

BlogEngine.NET 2.0

About this blog

ここブログ2は日々の出来事、ブログ1はプログラミング関係のトピックスになっています。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar