ASP.NET 多言語対応

ASP.NET 多言語対応

概要

各言語に応じたテキストをそれぞれ用意しておいた上で、
レスポンスの状況に応じて表示するテキストを切り替える技術

リソースファイル

言語毎に別々のリソースファイルを用意する。
ファイル名は自由。

格納場所:App_GlovalResourcesフォルダ
※フォルダの追加方法(VisualStudio2013forWeb)
サイト > 右クリックメニュー:「追加」> 「ASP.NETフォルダーの追加」> 「App_GlovalResources」
リソースファイル
※ファイルの追加方法(VisualStudio2013forWeb)
「App_GlovalResources」フォルダ > 右クリックメニュー:「追加」> 「新しい項目」> アセンブリリソースファイル
ファイル名(デフォルト):ファイル名.resx
ファイル名(別言語):ファイル名.ja.resx、ファイル名.en-US.resx、ファイル名.de-DE.resx等
asp_net_language_resource
作成したリソースファイルに名前(キー)、値をそれぞれ設定する。

リソースファイルの割り当て

※~.aspxファイル
<%@ Page
  Title="Home Page"
  Language="C#"
  AutoEventWireup="true"
  CodeBehind="Default.aspx.cs"
  Inherits="WebFormTest._Default"
  Culture="auto"
  UICulture="auto" %>
<%@ OutputCache
  VaryByParam="none"
  VaryByHeader="Accept-language"
  Duration="120" %>
<asp:label
  runat="server"
  text="<%$ Resources:MyResource, Greeting %>"
  ID="lblCurrent">
</asp:label>
※リソースファイル:MyResourceにおけるキー(名前):Greeting を表示する様に設定

テスト方法

※Chromeの場合
設定 > 詳細設定を表示する > 言語 > 言語と入力の設定
asp_net_language_browser
言語の優先順位をドラッグして入れ替える。
↑ では英語を優先している。

結果

ブラウザの言語が英語の時

リソースファイル名.resxのリソースファイルのテキストが表示される。
※本サイトの例では「Hello」
ブラウザの言語が日本語の時

リソースファイル名.jp.resxのリソースファイルのテキストが表示される。

ASP.NET 構成ファイル(Web.config/Machine.config)

構成ファイル(Web.config/Machine.config)

構成ファイル概要

・共通パラメータ
・アクセス制御(認証とユーザ管理)
・エラーページ
・文字コード
等アプリケーション共通で参照可能な値を記述するXML形式のファイル
2種類あり、
Machine.config
.NetFramework共通(サイト全体)の構成に使用。
Web.config
アプリケーションの構成に使用。
アプリケーション内で複数の構成を保持でき、
ページ毎に適用する構成を変更できる。

Webフォーム記述例

※構成ファイル
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="CompanyName" value="米良太事務所"/>
  </appSettings>
</configuration>

※aspxファイルから参照
<asp:Literal runat="server" Mode="Encode" Text="<%$ AppSettings:CompanyName %>"></asp:Literal>
⇒米良太事務所
※プログラムから参照
protected void Page_Load(object sender, EventArgs e)
{
  var a = System.Configuration.ConfigurationManager.AppSettings["CompanyName"];
  ⇒ a : 米良太事務所
}

MVC記述例

※構成ファイル
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="CompanyName" value="米良太事務所"/>
  </appSettings>
</configuration>

※コントローラー
public class IndexController : Controller
{
  public ActionResult Index()
  {
    ViewBag.a = System.Configuration.ConfigurationManager.AppSettings["CompanyName"];
    return View();
  }
}
※ビュー
<body>
  <div>
    @ViewBag.a
    ⇒ 米良太事務所
  </div>
</body>

<pages>要素

ページの挙動設定
<pages
  buffer="True"
  validateRequest="true" >
  <controls>…</controls>
  <namespaces>…</namespaces>
  <tagMapping>…</tagMapping>

</pages>

buffer属性:サーバーのバッファー使用設定

サーバーのメモリ(バッファー)に処理結果を保持するか否か?の設定
Trueにすると保持されレスポンスが早くなる。
デフォルト:True

validateRequest属性:検証設定

入力データを検証するか否か?の設定
Trueの場合、「<」「>」等の特殊文字がエラーを発生させるので安全。
独自でエスケープ処理等を記述する場合にのみFalseにする。
(「JavaScriptインジェクション① 従来型脆弱性対応(エスケープ処理等)」参照)
デフォルト:True

<system.web>要素

<glovalization>要素:言語設定

既定のカルチャ(地域)を定義する。
(カルチャを利用した多言語対応については「ASP.NET 多言語対応」参照)

<system.web>
  ~

  <glovalization
    requestEncoding="UTF-8"
    responseEncoding="UTF-8"
    culture="ja-JP"
    uiCulture="ja-JP" />
  
</system.web>

<sessionState>要素:セッション情報設定

セッション情報の保存場所・方法
<system.web>
 <sessionState
  mode="~"
  stateConnectionString="tcpip=~:42424"
  timeout="60"
  compressionEnabled="true"
  cookieless="~"
/>
</system.web>
ソース上でのSession操作については「ASP.NET Webフォーム 組み込みオブジェクト」参照

セッション情報の保存場所
mode="~"
StateServer:サーバー上の「StateSeverサービス」(オススメ)
stateConnectionString設定が更に必要。ポート番号:42424は固定

mode="StateSever"
stateConnectionString="tcpip=192.168.0.1:42424"
InProc:サーバーのメモリ上に格納(デフォルト)

mode="InProc"
Off:セッション無効

mode="Off"
SQLServer:SQLServerに保存

mode="SQLServer"

有効期限(デフォルト:20分)
timeout="60"

セッション情報の圧縮
compressionEnabled="true"

ユーザーを識別するセッションIDの受け渡し方法
cookieless="~"
UseCookies:常にクッキーを使用(安全)

cookieless="UseCookies"
UseUri:常にURLを使用(開発時用)

cookieless="UseUri"
AutoDetect/UseDeviceProfile:Cookiesを使用可能なら使用・・・と自動判別

cookieless="AutoDetect"
cookieless="UseDeviceProfile"

<trace要素>

デバッグ用設定
ASP.NET Webフォーム Traceオブジェクト/設定方法」参照

<httpCookies>要素

クッキー操作
<configuration>
  <system.web>

   <httpCookies
    ※HTTPプロトコル経由でのみアクセスできる
     (古いブラウザでは非対応)
    httpOnlyCookies="true"
    ※SSL通信のみを許可する
    requireSSL="false"
    ※クッキーが有効になるドメイン/フォルダを設定
    Domain="https://office-yone.com/"/>
  </system.web>
</configuration>

クッキー値設定は「ASP.NET Webフォーム Responseオブジェクト/クッキー操作」参照
クッキー値取得は「ASP.NET Webフォーム Requestオブジェクト/クッキーの取得」参照

<compilation>要素

デバッグ可否
<system.web>
  <compilation debug="true" />
</system.web>

<caching>要素

キャッシュの設定をページ単位でなくアプリケーション単位で適用する。
(ページ単位のキャッシュ設定は「ASP.NET Webフォーム キャッシュ」参照)
<caching>
 <outputCacheSettings>
  <outputCacheProfiles>
   <add name="MyCache" enabled="true" duration="120" varyByParam="*">
  </outputCacheProfiles>
 </outputCacheSettings>
<caching>
※~.aspx
<%@ OutputCache CacheProfile="MyCache" %>

ASP.NET Gloval.asax

ASP.NET Gloval.asax

概要

ASP.NETアプリケーションにおいて実行させる処理をまとめたファイル
~.aspxや、~.aspx.cs、~.cshtml、~.csファイル等に書かずに、
「Gloval.asax」として(固定)アプリケーションルート直下に置く事で一番最初に処理される。
特定の条件時のみ実行される「条件付きイベント」
リクエストの度に実行される「リクエストイベント」
がある。

記述例

public class Global : HttpApplication
{
  void Application_Start(object sender, EventArgs e)
  {
    // アプリケーションのスタートアップで実行するコードです
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    AuthConfig.RegisterOpenAuth();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
  }
  void Application_End(object sender, EventArgs e)
  {
    // アプリケーションのシャットダウンで実行するコードです
    
  }
  void Application_Error(object sender, EventArgs e)
  {
    // ハンドルされていないエラーが発生したときに実行するコードです
    
  }
}

条件付きイベント

アプリケーション起動時(最初の1回のみ)
Application_Start
未処理のアプリケーション異常発生時
Application_Error
アプリケーション終了・アンロード時
Application_End
ユーザセッション開始時(最初の1回のみ)
Session_Start
ユーザセッションセッション破棄・タイムアウト時
Session_End

リクエストイベント

リクエスト開始時(開始する前)
BeginRequest
リクエスト終了時(終了する前)
EndRequest
リクエスト認証開始時
AuthenticateRequest

ポストバックを発生させない方法

ポストバックとは

PostBack

通常

現在ブラウザに表示しているページとは別のページをリクエストする。
ニュースサイトの様にあるページを読み終わったら次のページ(別URL)・・・と。
(静的ページでは同じページを再度呼び出す意味は無い)

ポストバック

動的なサイトにおいて同一ページ:同一URL内でパラメーターを変えてSQLの実行結果を表示したりする目的で、クライアント側からサーバー側に処理を移す為に使用する。
その際、クライアントに返す(表示する)ページが同一ページである、という処理。
イベントハンドラーの発生&ページ遷移しない処理と同義。
ASP.NETではボタンクリック等で発生させる事ができる。
(発生して欲しくない時にも発生してしまう)
ポストバックでは描画を全てやり直すので処理の無駄が大きい。
以下は、不必要なポストバックを発生させない、
またはポストバック発生時の描画を制限する方法
なお、F5押下時等の再読み込みもポストバック。

レスポンス時に処理させない

ポストバック時と通常時に処理を分岐させる
ポストバックバックか否か?の判定
if ( ! Page.IsPostBack ) {
 初回のみ実行させる処理
 (ポストバック時はさせない処理)
}
bool ret = Page.IsPostBack;
⇒ ret : true(ポストバック時)
⇒ ret : false(通常時)

リクエストさせない

TextBox、RadioButton、CheckBox等

AutoPostBackプロパティをFalseに。
<asp:TextBox runat="server" AutoPostBack="False"></asp:TextBox>
※デフォルト:False
通常、これらのサーバーコントロールの処理イベントは即座にハンドルされず(ポストバックが発生しない)、ボタンクリックイベント等のポストバック発生時にまとめて処理される。
わざと発生させたい場合にこれをTrueにする。
(「ASP.NET Webフォーム ポストバックを発生させる方法」参照)
ボタンにこのプロパティはない。

Button、Link等

OnClientClickプロパティにReturn False;を設定
<asp:Button runat="server" Text="Button" OnClientClick="return false;" />
クライアント側のイベントが実行された後、エラーが発生する為、
サーバー側のクリックイベントが発生しなくなりASP.NETの管理を離れる。
クリックによって何かの処理をさせる場合はJavaScript等の処理が必要。

※~aspx/~.js
<script>
  function fnMethod()
  {
    ~OnClientClickで発生するクライアント側イベント~
  };
</script>
<asp:Button
  runat="server"
  Text="Button"
  ※サーバー側イベント
  OnClick="myButton_Click"
  ※クライアント側イベント
  OnClientClick="fnMethod(); return false;" /><br />
※~.aspx.cs
public partial class WebForm1 : System.Web.UI.Page
{

 protected void myButton_Click(object sender, EventArgs e)
 {
  ~OnClickで発生するサーバー側イベント~
 }
}

通常
OnClientClick

OnClick

今回
myMethod()

return false ←ここで処理が止まる。

Button1_Click() ←発生しない。

※なお、サーバー側で処理しないのであればASP.NET用ボタンである<asp:Button>及びrunat属性は必要ないのでhtmlのボタンが望ましい。

<button
  onclick="fnMethod(); return false;">
  Button
</button>

Ajaxコントロールによる非同期通信

Ajax通信では厳密にはポストバックは発生するが、画面全体の再描画は行われない。
ASP.NET Webフォーム Ajax利用」参照

<form>要素

※フォーム内ボタン

  

<form>
  <input type="submit" value="更新" />
  ⇒リクエスト処理が発生する
</from>

※フォーム無し

<button>ボタン</button>
⇒リクエスト処理が発生しない
前述:return false; 設定した場合同様、
サーバー側へリクエストが発生しなくなり、ASP.NETの管理を離れる。
クリックによって何かの処理をさせる場合はJavaScript等の処理が必要。
Button、Link等」参照

参考

リンクボタンのPostBackUrl属性に別URLを指定した場合
※index.aspx
<asp:LinkButton
  ID="myLink"
  runat="server"
  OnClick="myLink_Click"
  PostBackUrl="~/next.aspx">
  LinkButton2
</asp:LinkButton>
index.aspx.cs(vb)におけるリンククリックイベントは発生せず、
(next.aspx.cs(vb)におけるリンククリックイベントも同様)
ポストバックは発生しない。
通常のリンク
<a href="next.aspx">aaa</a>
と同じ

ポストバックを発生させる方法

ASP.NETコントロールのイベントをハンドルする

【index.aspx】(クライアント側処理)
<asp:button
  id="myAspButton"
  runat="server"
  OnClick="myAspButton_Click"
  Text="myAspButton"></asp:button>

【index.aspx.vb】(サーバー側処理)
Public Class index
  Inherits System.Web.UI.Page

  
  <asp:button>はサーバー側で処理できるコントロール
  Protected Sub myAspButton_Click(sender As Object, e As EventArgs)
    Handles myAspButton.Click
    ‘ここを通る
  End Sub
End Class

AutoPostBackプロパティをTrueに

TextBox、RadioButton、CheckBox等はデフォルトでは値を変更してもポストバックが発生しない。
即、サーバーに処理を移したい場合にこの設定を行う。
【index.aspx】(クライアント側処理)
<asp:TextBox
  ID="myText"
  runat="server"

  AutoPostBack="True&quot;
  OnTextChanged="myText_TextChanged">
</asp:TextBox>
【index.aspx.vb】(サーバー側処理)
Public Class index
  Inherits System.Web.UI.Page

  
  protected void myText_TextChanged(object sender, EventArgs e)
  {
    //ここを通る
  }
End Class

クライアント側操作でサーバーに処理を移す方法

【index.aspx】(クライアント側処理)

htmlリンク
↓ ASP.NETコントロール
<asp:button
  id="myAspButton"
  runat="server"
  OnClick="myAspButton_Click"
  Text="myAspButton"></asp:button>

↓ htmlコントロール
<a href="#" id="myLink">aaa</a>
<script type="text/javascript">
  $(function () {

    //htmlコントロールはクライアント側で処理
    $("#myLink").click(function () {
      //<asp:button>の「click」イベントを発生させる
      $("#myAspButton").trigger("click");
    });
  });
</script>

【index.aspx.vb】(サーバー側処理)
Public Class index
  Inherits System.Web.UI.Page

  
  <asp:button>はサーバー側で処理できるコントロール
  Protected Sub myAspButton_Click(sender As Object, e As EventArgs)
    Handles myAspButton.Click
    ‘ここを通る
  End Sub
End Class