この記事では、Asp.net におけるリソースのグローバリゼーションとローカリゼーションの基本概念から始めて、Asp.net1.1 および Asp.net2.0 でグローバリゼーションとローカリゼーションを実現する手順と方法について説明します。
1つ。基本的な考え方
1.なぜリソースをローカライズするのでしょうか?
私たちのサイトは、世界中のさまざまな国や地域の人々に閲覧される可能性があり、それぞれの国や地域の人々は独自の言語や文化的特徴を持っています。私たちの偉大な祖国を例に挙げると、中国本土では簡体字中国語が使用され、香港、マカオ、台湾では繁体字中国語が使用されます。また、通貨、数字、カレンダーなどの表現形式は国ごとに異なり、我が国では主に年、月、日の形式が使用されますが、米国では月、日、年の形式が使用されます。このように多くの違いがあるため、多くの例は示しません。ウェブサイト訪問者により良いユーザーエクスペリエンスを提供するために、ユーザーが言語と地域を選択している限り、サイトはその言語と文化的習慣に従ってページ情報を表示する、グローバルなソリューションを提供する必要があります。ローカリゼーション。
2.カルチャ、固定カルチャ、非特定カルチャ、カルチャ固有の
カルチャ名は RFC 1766 標準に従い、「<言語コード 2>-<国/地域コード 2>」の形式になります。ここで、<言語コード 2> は ISO 639-1 から派生しています。 2 文字の小文字コード、<country/regioncode2> は ISO 3166 から派生した 2 文字の大文字コードです。たとえば、米国英語は「en-US」です。 2 文字の言語コードが利用できない場合は、ISO 639-2 から派生した 3 文字のコードが使用されます。たとえば、ディベヒ語が話されている地域には 3 文字のコード「div」が使用されます。一部のカルチャ名には、表記記号を指定する接尾辞が付いています。たとえば、「-Cyrl」はキリル文字の表記記号を指定し、「-Latn」はラテン語の表記記号を指定します。例:
文化名 | 文化識別子 | 言語-国 |
zh-CN | 0x0804 | 中国語-中国 |
zh-TW | 0x0404 | 中国語-台湾 |
zh-CHS | 0x0004 | 簡体字中国語 |
zh-CHT | 0x |
7C |
04 | 繁体 | |
en | 0x0009 | 英語 |
en | - | US |
0x0409 | 英語 | - アメリカ合衆国 en - GB |
uz | - | UZ - Cyrl |
0x0843 | ウズベク語 (キリル文字) - ウズベキスタンuz-UZ-Latn 0x0443 | ウズベク語 (ラテン語) -ウズベキスタン |
固定文化はありません文化に敏感。空の文字列 ("") を使用して、名前またはカルチャ識別子 0x007F で固定カルチャを指定できます。インバリアント カルチャ インスタンスは、CultureInfo クラスの InvariantCulture プロパティによって表されます。固定文化は英語にのみ関連付けられており、どの国にも関連付けられません。これは、カルチャを必要とする「グローバル化された」名前空間のほぼすべてのメソッドで使用できます。プログラムで文字列の比較や大文字と小文字の変更操作を実行する場合は、InvariantCulture を使用して、システムによって設定されたカルチャに関係なく、InvariantCulture で表される英語の固定カルチャに従って動作が行われるようにする必要があります。ただし、固定カルチャは、カルチャに依存しない結果を必要とするプロセス (システム サービスなど) でのみ使用する必要があります。そうしないと、得られる結果が言語的に正しくないか、文化的に不適切になる可能性があります。例: CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture; これら 2 行のコードは同じ効果を持ち、目的はインバリアント カルチャ インスタンスを取得することです。
たとえば、DateTime インスタンス dateTime で dateTime.ToString() メソッドを実行するとします。このメソッドは実際に、現在のスレッドの CurrentCulture をデフォルト カルチャとして使用し、このカルチャに基づいて日付インスタンスを対応する文字列形式に変換します。したがって、現時点でスレッドまたはシステム カルチャに従って ToString 操作を実行する必要がない場合は、このメソッド dateTime.ToString("G", CultureInfo.InvariantCulture) または dateTime.ToString("G" ) を使用する必要があります。 、DateTimeFormatInfo.InvariantInfo) 。
中立文化とは、言語には関連付けられているが、国には関連付けられていない文化です。特定の文化とは、特定の言語および特定の国に関連付けられた文化です。たとえば、「en」は中立的な文化ですが、「en-US」は特定の文化です。 「zh-CHS」(簡体字中国語) と「zh-CHT」(繁体字中国語) は文化に依存しないことに注意してください。
カルチャは階層構造を持っています。つまり、特定のカルチャの親は非特定のカルチャであり、非特定のカルチャの親は InvariantCulture です。 CultureInfo クラスの Parent プロパティは、特定のカルチャに関連付けられた非特定のカルチャを返します。カルチャ固有のリソースがシステム上に存在しない場合、または使用できない場合は、カルチャ固有でないリソースが使用されます。カルチャ固有のリソースも使用できない場合は、メイン アセンブリに埋め込まれたリソースが使用されます。
3. ローカリゼーションのための共通の型、プロパティ、およびメソッドを実装します。
CultureInfo クラスは、カルチャの名前、使用される表記法、カレンダーなどの特定のカルチャに関する情報と、一般的な操作 (日付の書式設定など) に関する情報を表します。文字列のソート)、文化固有の情報オブジェクトへのアクセスを提供します。 CultureInfo クラスをインスタンス化するには、通常、次の 2 つの方法があります。
CultureInfo カルチャー = CultureInfo.CreateSpecificCulture (名前);
CultureInfo culture = new CultureInfo(name);
2 つの違いは、最初の方法を使用すると、固定カルチャまたは特定のカルチャの CultureInfo インスタンスのみを作成できることです。 name が空の文字列の場合、固定カルチャ インスタンスが作成されます。 name が非特定のカルチャの場合は、name に関連付けられたデフォルトのカルチャ固有の CultureInfo インスタンスが作成されます。 2 番目の方法は、名前で指定されたカルチャの CultureInfo インスタンスを作成することです。これは、固定、非固有、またはカルチャ固有にすることができます。
Thread クラスの CurrentCulture プロパティは、現在のスレッドのカルチャを取得または設定するために使用されます。特定のカルチャに設定する必要があります。 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = new CultureInfo("en "); の場合、エラーが報告されます。
Thread クラスの CurrentUICulture プロパティは、リソース マネージャーが実行時にカルチャ固有のリソースを検索するために使用する現在のカルチャを取得または設定するために使用されます。ここでのリソース マネージャーは、ResourceManger クラスに関連付けることができます。
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
ResourceManger クラスは、カルチャ固有のリソースを検索し、ローカライズされたリソースが存在しない場合に代替リソースを提供し、リソースのシリアル化をサポートします。一般的に使用される ResourceManager コンストラクターは public ResourceManager(string, Assembly) です。その意味は、ResourceManager クラスの新しいインスタンスを初期化し、指定されたルート名を使用して指定されたアセンブリからリソース ファイルを検索することです。いわゆるルート名とは、例えば、「MyResource.en-US.resources」という名前のリソースファイルのルート名は「MyResource」である。名前空間は、「MyWebSite.Resource.UserFolder.MyResource」などのルート名の式に追加できます。アセンブリには、リソース ファイルを呼び出す必要があるページが配置されているアセンブリ (typeof(MyPage).Assembly など) を指定できます。 ResourceManager クラスの GetString メソッドは、リソース ファイル内の指定されたキーの値を取得するために使用されます。例: スレッドの CurrentUICulture プロパティが設定されている場合、次の方法に従います。
ResourceManager rm = new ResourceManager("アイテム", Assembly.GetExecutingAssembly());
String = rm.GetString("welcome");
指定したカルチャに応じてリソースを取得したい場合は、次のように記述します。
ResourceManager rm = new ResourceManager("アイテム", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
文字列 str = rm.GetString("ようこそ",ci);
二。 Asp.net1.1 でリソースのローカリゼーションを実装するには、
まず Web サイト プロジェクト WebTest に Resource フォルダーを作成し、プロジェクト全体に共通のリソース ファイルをこのフォルダーに保存する必要があります。たとえば、MyResource.en.resx、MyResource.en-US.resx、MyResource.zh-CN.res の 3 つのリソース ファイルを作成しました。各リソース ファイルには 2 つのキーと値のペアがあり、キー値は State と Address です。以下に示すように、リソース ファイルを使用する必要があるページ MyPage.aspx でリソース ファイルを呼び出します。
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
スレッド.CurrentThread.CurrentUICulture = スレッド.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("状態");
Label2.Text = rm.GetString("Address");
さて、この時点では、Label1 と Label2 は MyResource.zh-CN.resx ファイルの規定に従って「状態」と「アドレス」を表示します。上記は最も基本的で単純な位置特定方法ですが、ここにはいくつかの問題が隠されています。この方法を 1 つずつ解決して最適化してみましょう。
1. ユーザーのデフォルト カルチャを取得する方法は
、ユーザーのブラウザの [プロパティ] -> [言語] オプションの設定を通じて、一番上のものをユーザーのデフォルト言語として使用します。
CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
通常、CurrentCulture と CurrentUICulture は同じカルチャを持つように設定されます。たとえば、CurrentCulture を en-US に、CurrentUICulture を zh-CN に指定することもできます。この結果、ページ上の通貨、日付、その他の情報がアメリカ英語形式で表示され、リソース マネージャーはリソース ファイルから取得する必要があるコンテンツを MyResource.zh-CN.resx から取得します。ファイル。
サイト ページにユーザーが言語を選択する機能が提供されていない場合は、デフォルトでユーザーのブラウザーで設定されたカルチャに従って表示されるため、上記のコードを Global.asax の Application_BeginRequest メソッドに置くことができます。 csファイル。このようにして、ユーザーがページをリクエストするたびに、プログラムが最初にカルチャを設定します。
2. ユーザーのロケール設定を記憶する
ブラウザのロケール設定または選択は、セッションを通じて記憶できます。ただし、その時点ではセッションがまだ利用できないため、この操作は Global.asax.cs ファイルの Application_BeginRequest メソッドでは実行できません。ユーザーが言語を選択する機能がサイトに提供されていない場合は、ユーザーの地域設定を覚えておく必要はありません。上記のように、Global.asax.cs ファイルの Application_BeginRequest メソッドに設定するだけです。影響はありません。パフォーマンス。これにより主に、ユーザーが途中でブラウザーの言語設定を突然変更したにもかかわらず、Web サイトはセッションに保存されているカルチャに従ってページ コンテンツをユーザーに表示するという競合が回避されます。
ユーザーに言語を選択させる機能について言及した場合は、明らかに、ページ プログラムのセッションを使用して、ユーザーの文化選択を記録する必要があります。クライアントからサーバー セグメントへのすべてのリクエストにより、サーバー セグメントは処理と応答のために新しいスレッドを開きます。プログラムが顧客の選択を記憶していない場合、デフォルトのカルチャでのみ応答します。
3. リソース マネージャーは、指定されたカルチャに対応するリソース ファイルをどのように見つけますか?
値の操作を実行するとき、つまり ResourceManager クラスの GetString メソッドを実行するとき、リソース マネージャーは、現在のスレッドの CurrentUICulture プロパティに従って、対応するリソース ファイルを検索します。いくつかの状況があります。
(1) たとえば、現在の CurrentUICulture に対応するカルチャが en-US の場合、まず MyResource.en-US.resx が存在するかどうかを確認し、存在しない場合はそこから値を取得します。 MyResource.en.resx が存在するかどうか。
(2) たとえば、現在の CurrentUICulture に対応するカルチャは en です。en は非特定のカルチャであるため、最初に特定のカルチャ en-US のリソース ファイル MyResource.en-US.resx が関連付けられているかどうかを確認します。デフォルトで存在する場合は、そこから値を取得します。存在しない場合は、MyResource.en.resx が存在するかどうかを確認します。
(3) たとえば、現在の CurrentUICulture に対応するカルチャが en-GB の場合、まずリソース ファイル MyResource.en-GB.resx が存在するかどうかを確認します。存在する場合は、そこから値を取得します。存在しない場合は、en に関連付けられたデフォルトの特定のカルチャ en-US のリソース ファイル MyResource.en-US.resx が存在するかどうかを確認します。現時点では MyResource.en-CA.resx が存在しても、プログラムは適切なリソース ファイルが見つからないという例外をスローします。
したがって、現在のスレッド CurrentUICulture が特定のカルチャに対応する場合、リソース マネージャーはまず、この特定のカルチャに対応するリソース ファイルを検索します。見つからない場合は、その非カルチャ リソース ファイルを探します。まだ見つかっていないので、「検索」して、カルチャ固有ではない関連付けに関連付けられているデフォルト カルチャのリソース ファイルを探します。現在のスレッドの CurrentUICulture が非特定のカルチャに対応する場合、リソース マネージャーはまず、非特定のカルチャに対応するデフォルトのカルチャ固有のリソース ファイルが存在するかどうかを確認します。存在しない場合は、非特定のカルチャに対応するリソース ファイルがあるかどうかを確認します。 - 固有のカルチャが存在し、それも存在しない場合は例外をスローします。
4.ローカリゼーション サポートを提供しない文化にどう対処するか?
サイトがユーザーのデフォルト カルチャをサポートする対応するリソース ファイルを提供していない場合は、現在のスレッドの CurrentUICulture をサイトのデフォルト カルチャ (en-US や zh-CN など) に変換する必要があります。変換の機会は 2 つあります。
1 つは、Request.UserLanguages[0] を取得したときに、構成ファイルでサポートされているカルチャ プリセットと比較し、サポートされていないことが確認された場合は、すぐに CurrentUICulture をデフォルト カルチャとして設定することです。
2 つ目は、ResourceManager の GetString メソッドを使用して値を取得するときに、try catch 構造体を使用して MissingManifestResourceException 例外をキャプチャすることです。まず、CurrentUICulture をデフォルトのカルチャに設定し、次に GetString を使用して値を再度取得します。
<globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="zh-CN" culture="en-US"/>
を通じてサイトのデフォルトのカルチャと uiCulture を設定します。
上に示すように、サイトのデフォルト カルチャは en-US (ここでは特定のカルチャである必要があります)、uiCulture は zh-CN であることが指定されています。
もちろん、各ページの Page タグ <@Page Culture="zh-CN" UICulture="en"> でページごとに設定することもできます。ここでの web.config の設定に関係なく、ページは Page タグの設定に従って表示されます。
三つ。 Asp.net2.0 でのリソース ローカリゼーションの実装
Asp.net2.0 では、リソース ローカリゼーションのためのより多様な実装方法が提供されます。ここでは、Asp.net1.1 との違いに焦点を当てます。
1. Web.config を使用してサイトの既定のカルチャと uiCulture を設定することについては、
Asp.net1.1 で web.config ファイルを使用してサイトのカルチャを設定する方法についてすでに説明しましたが、Asp.net2.0 ではより柔軟です。通常、サイト内のすべてのページが同じカルチャに準拠する必要があります。以下に示すように、web.config の globalization 要素の UICulture 属性と Culture (文化) 属性にサイト全体の "auto" 値を割り当てるだけです。この "auto" 値は、Asp.net1.1 では使用されないことに注意してください。 <globalization uiCulture="auto" culture="auto" /> auto の意味は、ASP.NET がブラウザーから送信された HTTP ヘッダーを確認してユーザーの優先カルチャ設定を取得し、このカルチャを使用して、デフォルトのカルチャを設定することです。つまり、現在のスレッドの CurrentUICulture プロパティと CurrentCulture プロパティです。
自動設定に加えて、Asp.net のサイトの既定のカルチャを指定することもできます。 <globalization uiCulture="auto:zh-CN" culture="auto:zh-CN" /> 注: これは ASP の場合にのみ可能です。 NET は、ユーザーの優先カルチャを決定するための HTTP ヘッダーを見つけることができません。たとえば、ブラウザーの [プロパティ] -> [言語] にカルチャ設定がなく、それが完全に空の場合、auto の後に設定されたデフォルトのカルチャが有効になります。
web.config でグローバリゼーションを構成した後、アプリケーションはコードを記述する必要はありません。スレッドの CurrentUICulture と CurrentCulture は、globalization 要素で設定された uiCulture および culture 属性値に従ってカルチャ設定を取得します。グローバリゼーションが構成されていない場合、スレッドの CurrentUICulture と CurrentCulture はデフォルトで en-US になります。
2. Web.config ファイルを使用してユーザーの地域選択を追跡します。Asp.net1.1
では、地域選択を提供するサイトは通常、ユーザーがサイトに要求を行うたびにセッションを使用してユーザーの選択を記録します。表示コンテンツは、ユーザーが選択した文化に従ってローカライズされます。 Asp.net2.0 で提供されるもう 1 つの方法は、web.config ファイルを使用してユーザーのカルチャ選択を追跡することです。
LanguagePreference と呼ばれる文字列ベースのプロファイル プロパティを web.config ファイルに追加することで、ユーザーの文化の匿名識別をサポートできます。 anonymousIdentification 要素の Enabled 属性は「true」でなければならないことに注意してください。そうしないと、匿名識別機能が使用できなくなります。
<anonymousIdentification Enabled="true"/>
<プロフィール>
<プロパティ>
<add name="LanguagePreference" type="string"defaultValue="auto"allowAnonymous="true" />
</プロパティ>
</profile>
以下では、Asp.net2.0 で LanguagePreference 属性をプログラムする方法を説明します。まず、System.Web.UI.Page を継承し、サイト内のすべてのページ クラスの基本クラスとして機能する PageBase クラスを作成できます。この目的は実際には非常に単純で、各ページで共通する処理プロセスをいくつか抽出して基本クラスに組み込むことで、コードの重複を減らし、保守性を向上させることです。次に、PageBase クラスに次のコードを記述します。 protected override void InitializeCulture()
{
Base.InitializeCulture();
文字列 LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
// ユーザーがこのサイトに初めてアクセスし、Profile.LanguagePreference が空の場合、ユーザーのブラウザの言語設定を識別します
if(string.IsNullOrEmpty(言語設定))
{
if (this.Context.Request.UserLanguages != null)
{
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
}
}
それ以外
{
Thread.CurrentThread.CurrentUICulture = 新しい CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
System.Web.UI.Page クラスの InitializeCulture メソッドは、Asp.net2.0 で新たに追加されました。これは、現在のスレッドの Culture と UICulture を設定します
。
ページのライフ サイクルは、ページの初期化と読み込みの前に InitializeCulture メソッドが実行されるように設計されています。上記のコードでは、まず ((ProfileCommon)this.Context.Profile).LanguagePreference; を使用して現在の LanguagePreference プロファイル属性の値を取得し、それが空かどうか、つまりユーザーの文化設定が保存されているかどうかを判断します。 。空の場合、ユーザーの優先カルチャは Http ヘッダーから取得され、((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference; を介して保存されます。空でない場合は、ユーザーのカルチャ設定が保存されていることを意味し、このカルチャを使用して現在のスレッドの CurrentUICulture プロパティと CurrentCulture プロパティを設定します。
<globalization uiCulture="auto" culture="auto" /> が Web.config で定義されている場合、上記のコードは次のように簡略化できます。 protected override void InitializeCulture()
{
Base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
if(!string.IsNullOrEmpty(LanguagePreference))
{
Thread.CurrentThread.CurrentUICulture = 新しい CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
それ以外
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
}
サイトのマスター ページに言語選択のリストを配置するなど、ユーザーがカルチャを選択できる機能がサイトに提供されている場合、次のステートメントを通じてユーザーによるカルチャの選択を記憶できます
。
protected void lstLanguage_SelectedIndexChanged(オブジェクト送信者,EventArgs e)
{
if (lstLanguage.SelectedValue != "Auto") //デフォルトのオプションは自動です
{
Profile.LanguagePreference = lstLanguage.SelectedValue;
}
それ以外
{
Profile.LanguagePreference = null;
}
Response.Redirect(Request.Url.AbsolutePath);
}
イベント処理コードは Page_Load の後に実行されるため、コード行 Response.Redirect(Request.Url.AbsolutePath) に注意してください。ページをすぐに変更したい場合は、リダイレクト操作を実行する必要があります。
Asp.net2.0 の
サイトにグローバル リソース ファイルを作成する場合
、VS.Net2005 はグローバル リソース ファイルを格納するための App_GlobalResources フォルダーを自動的に作成します。いわゆるグローバル リソース ファイルは、サイト内の複数のページ ファイルまたはマスター ページによって使用されるリソース ファイルです。 MyResource.resx および MyResource.zh-cn.resx という名前のファイルを作成するとします。プログラムでは、次のコードを使用してリソース ファイル内の値を取得できます。
ここで、 Country はリソース ファイル内のキーです。明らかに、これは Asp.net 1.1 のリソース ファイルから値を取得するよりもはるかに簡単です。
ここで注意すべき問題が 2 つあります。まず、同じルート名を持つリソース ファイルのグループを作成する場合、MyResource.resx などのカルチャ識別のないファイル、MyResource.en-gb などのファイルを作成する必要があります。 zh-cn.resx は必要に応じて作成されます。 MyResource.resx が作成されず、MyResource.zh-cn.resx のみが作成された場合、MyResource は上記のコードの Resources 名前空間の下に表示されないため、上記のコードのコンパイルは通過できません。現在のスレッドの CurrentUICulture に一致するローカライズされたリソース ファイルが見つからない場合、またはローカライズされたリソース ファイルで対応するキー値が見つからない場合に備えて、MyResource.resx にはサイトのデフォルト言語のコンテンツを保存する必要があります。 Asp.net は MyResource.resx ファイル内のキーに基づいています。国キーが MyResource.resx に存在しないが、国キーが MyResource.zh-cn.resx に存在する場合、上記のコードでもエラーが報告されます。コンパイル時。次に、Asp.net は、対応する領域でローカライズされたリソースが見つからない場合でも例外を報告しません。値は MyResource.resx ファイルから自動的に取得されますが、現在のスレッドの CurrentUICulture は変更されません。
サイトでローカル リソース ファイルを作成する場合、VS.Net2005 はローカル リソース ファイルを保存するための App_LocalResources フォルダーを自動的に作成します。いわゆるローカル リソース ファイルは、サイト内の単一のページ ファイルに使用されるリソース ファイルです。その命名方法は通常、Default.aspx.resx および Default.aspx.zh-cn.resx です。次に、3 つのキー Language、lblNavigation.Text、lblNavigation.ForeColor を Default リソース ファイルに追加します。このうち、Default.aspx.resxのlblNavigation.ForeColorに青、Default.aspx.zh-cn.resxのlblNavigation.ForeColorに赤を設定しました。ページ ファイルの Default.aspx 内のローカル リソース ファイルからコンテンツを取得するには、次の 2 つの方法があります。
(1)。<asp:Label ID="lblLanguage" runat="server" Text="<%$ Resources:Language %>"></asp:Label>
(2)。<asp:Label ID="lblNavigaion" runat="server" meta:resourcekey="lblNavigation"></asp:Label>
最初の方法を使用するときは、$ 記号の使用に注意してください。 2 番目の方法を使用すると、より柔軟であり、コントロールの多くのプロパティの値を一度に設定できます。
ここで注意すべき問題がまだあります。Default.aspx.resx が必要である、Default.aspx.zh-cn.resx が必要であるなど、ページのデフォルトのローカル リソース ファイルを作成する必要があります。デフォルトのローカル リソース ファイルを作成せずに、ページ内でローカル リソース ファイルを使用する場合、最初の方法でバインドするとコンパイル エラーが発生しますが、2 番目の方法でバインドするとコンパイル エラーは発生しません。エラーが発生しますが、これらのプロパティの設定は、書き込まれていないかのように影響しません。
4.ローカライズされたイメージの表示
ローカライズされたイメージの表示も、Asp.net2.0 の新機能です。 Asp.net2.0 では、リソース ファイルは文字列型のキーと値のペアの組み合わせに限定されず、複数の種類のファイルを保存できます。この機能を使用して画像をローカライズします。実際、いわゆるローカライズされたイメージは、さまざまな地域用に用意されたイメージをさまざまなローカライズされたリソース ファイルに配置することにすぎません。たとえば、LitwareSlogan.jpg を MyResource.resx に配置し、LitwareSlogan.cn.jpg を MyResource.zh-cn.resx に配置します。
さまざまなローカライズされたバージョンのグローバル リソース ファイルにイメージ ファイルのローカライズされたバージョンが含まれている場合、MyLocalImage.ashx という名前のハンドラー ファイルをカスタマイズして、ユーザーの言語設定に基づいて条件付きでロードできます。コードは次のとおりです。
ページ内のメソッド呼び出し:
<asp:Image ID="Image1" runat="server" ImageUrl="~/ MyLocalImage.ashx" />
MyLocalImage.ashx のハンドラーの書き方:
public class MyLocalImage: IHttpHandler
{
public void ProcessRequest (HttpContext コンテキスト)
{
context.Response.ContentType = "画像/png";
文字列LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
if (!string.IsNullOrEmpty(LanaguageReference))
{
Thread.CurrentThread.CurrentUICulture = 新しい CultureInfo(LanaguageReference);
}
ビットマップ bm = Resources.Litware.LitwareSlogan;
MemoryStream イメージ = new MemoryStream();
bm.Save(画像,画像形式.Png);
context.Response.BinaryWrite(image.GetBuffer());
}
、
カスタム InitializeCulture メソッドで前に説明したのと同様のロジックを使用して、グローバル リソース ファイルからイメージ ファイルを取得する前に現在のスレッドの CurrentUICulture 設定を初期化します。現在のスレッドの CurrentUICulture がページの基本クラスに設定されているのに、なぜここでリセットする必要があるのか疑問に思われるかもしれません。これは、ここでのスレッドが基本クラスで処理されるスレッドと同じではないためです。カスタム ハンドラーが CurrentUICulture 設定を正しく初期化すると、MyResource.resx の厳密に型指定されたリソース クラスを通じてイメージ ファイルにアクセスできるようになります。あとは、画像ファイルのビットを HTTP 応答ストリームに書き込むだけです。