ページが現在使用している .resx ファイルを取得するにはどうすればよいですか? たとえば、Default.aspx でカルチャを fr-FR に設定すると、どちらが存在するかに応じて、Default.aspx.fr.resx または Default.aspx.fr-FR.resx または Default.aspx.resx が返されます。
彼らはASP.NETにそのようなものを持っていますか、それとも自分で書かなければなりませんか?
ページが現在使用している .resx ファイルを取得するにはどうすればよいですか? たとえば、Default.aspx でカルチャを fr-FR に設定すると、どちらが存在するかに応じて、Default.aspx.fr.resx または Default.aspx.fr-FR.resx または Default.aspx.resx が返されます。
彼らはASP.NETにそのようなものを持っていますか、それとも自分で書かなければなりませんか?
ResourceManager クラスのGetResourceFileName()メソッドを使用して、有効なリソース カルチャ名を作成できます。リフレクターを介してメソッドの実装をざっと見てみると、メソッドが呼び出し元から渡された CultureInfo オブジェクトの name プロパティを利用して、リソース ファイル名を作成していることがわかります。
protected virtual string GetResourceFileName(CultureInfo culture)
{
StringBuilder builder = new StringBuilder(0xff);
builder.Append(this.BaseNameField);
if (!culture.Equals(CultureInfo.InvariantCulture))
{
CultureInfo.VerifyCultureName(culture, true);
builder.Append('.');
builder.Append(culture.Name);
}
builder.Append(".resources");
return builder.ToString();
}
GetResourceFileName() メソッドは、内部静的メソッド VerifyCultureName() を呼び出して、有効なリソース カルチャ名があることを確認します。VerifyCultureName() メソッドを調べると、単純な検証が行われていることがわかります。
internal static bool VerifyCultureName(CultureInfo culture, bool throwException)
{
if (culture.m_isInherited)
{
string name = culture.Name;
for (int i = 0; i < name.Length; i++)
{
char c = name[i];
if ((!char.IsLetterOrDigit(c) && (c != '-')) && (c != '_'))
{
if (throwException)
{
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidResourceCultureName", new object[] { name }));
}
return false;
}
}
}
return true;
}
GetResourceFileName() メソッドを利用するには、ResourceManager 型からクラスを派生させ、基本クラスの仮想メソッドをオーバーライドする必要があります。GetResourceFileName() メソッドは保護されているため、パブリック メソッドでラップして外部に公開する必要があります。
public class ResxResourceManager : ResourceManager
{
protected override string GetResourceFileName(System.Globalization.CultureInfo culture)
{
return base.GetResourceFileName(culture);
}
public string GetResxFileName(System.Globalization.CultureInfo culture)
{
return GetResourceFileName(culture).Replace(".resources", ".resx");
}
}
この方法で現在のリソースファイルを返す組み込みプロパティを認識していません。
CultureInfo.CurrentUICulture.Name
使用中の現在のUICultureを返し、Nameプロパティは短縮形です。これを使用して、自分で情報を作成できます。次に例を示します。
string pageResx = VirtualPathUtility.GetFileName(Request.Path) + "." +
CultureInfo.CurrentUICulture.Name + ".resx";
この情報で何をする予定かによって、私は多少慎重になるので、シナリオに対してこのアプローチをテストする必要があります。