2

ページが現在使用している .resx ファイルを取得するにはどうすればよいですか? たとえば、Default.aspx でカルチャを fr-FR に設定すると、どちらが存在するかに応じて、Default.aspx.fr.resx または Default.aspx.fr-FR.resx または Default.aspx.resx が返されます。

彼らはASP.NETにそのようなものを持っていますか、それとも自分で書かなければなりませんか?

4

2 に答える 2

3

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");
    }
}
于 2009-07-09T03:03:30.673 に答える
0

この方法で現在のリソースファイルを返す組み込みプロパティを認識していません。

CultureInfo.CurrentUICulture.Name使用中の現在のUICultureを返し、Nameプロパティは短縮形です。これを使用して、自分で情報を作成できます。次に例を示します。

string pageResx = VirtualPathUtility.GetFileName(Request.Path) + "." + 
CultureInfo.CurrentUICulture.Name + ".resx";

この情報で何をする予定かによって、私は多少慎重になるので、シナリオに対してこのアプローチをテストする必要があります。

于 2009-07-09T01:41:58.613 に答える