2009-07-09 7 views
2

ページが現在使用している.resxファイルをどのように取得しますか?たとえば、Default.aspxでcultureをfr-FRに設定した場合、Default.aspx.fr.resxまたはDefault.aspx.fr-FR.resxまたはDefault.aspx.resxはどちらが存在するかによって異なります。ページが現在使用している.resxファイル

ASP.NETのようなものがあるのでしょうか、それとも自分で書かなければなりませんか?

答えて

0

私は、この方法で現在のリソースファイルを返すビルトインプロパティを認識していません。

CultureInfo.CurrentUICulture.Nameは、使用中の現在のUICultureを返します。Nameプロパティは、短縮形です。次の例のように、情報を自分で構築するためにこれを使用することもできます。

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

あなたは私がやや慎重になると、あなたのシナリオで、このアプローチをテストする必要があり、この情報をどうする予定の内容に応じて。

+0

これは私が始めたものです。ページが.aspx.resxを使用している場合でも、常に.aspx.en-US.resxを通知します。私はen.resxとen-US.resxの存在を確認するコードを追加して、フォールバックの事例を説明しました。それを見つける標準的な方法があればうれしいでしょう。 –

+0

@Ben:そうです、それはデフォルトリソースの警告です。 –

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()メソッドを調べると、単純な検証が行われることがわかります。あなたがこのResourceManagerタイプからクラスを派生し、基本クラスの仮想メソッドをオーバーライドする必要がありますGetResourceFileName()メソッドを使用するように

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()メソッドは保護されているため、公開メソッドでラップして外部に公開する必要があります。

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"); 
    } 
} 
+0

これは私のカスタムメソッドから得られるものに近いです。これはDefault.aspx.en-US.resxを返します。しかし、en-us.resxが存在しないため、このページは実際にDefault.aspx.resxを使用しています。 現在、en-us.resxまたはen.resxが存在するかどうかを確認しています。次にデフォルトの.resxに戻ってください。これは問題なく動作します。それを見つけるためのより良い/標準的な方法があるかどうか疑問に思うだけです。 –

関連する問題