2009-07-09 10 views
2

Wie erhalten Sie die RESX-Datei, die die Seite gerade verwendet? Wenn ich zum Beispiel culture auf fr-FR auf Default.aspx setze, sollte es mir Default.aspx.fr.resx oder Default.aspx.fr-FR.resx oder Default.aspx.resx abhängig davon geben, welches existiert..resx-Datei, die die Seite gerade verwendet

Haben sie so etwas in ASP.NET oder muss ich es selbst schreiben?

Antwort

0

Mir ist keine integrierte Eigenschaft bekannt, die die aktuelle Ressourcendatei auf diese Weise zurückgibt.

CultureInfo.CurrentUICulture.Name gibt die aktuelle UICulture in Verwendung zurück, und die Name-Eigenschaft ist die verkürzte Form. Sie könnten so die Informationen selbst, zum Beispiel für den Aufbau:

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

Je nachdem, was Sie planen, mit dieser Information zu tun, würde ich etwas vorsichtig sein, und Sie sollten diese Vorgehensweise für Ihr Szenario testen.

+0

Dies ist, was ich begann mit. Es wird Ihnen immer aspx.en-US.resx sagen, auch wenn die Seite .aspx.resx verwendet. Ich habe Codes hinzugefügt, um nach der Existenz von en.resx und en-US.resx zu suchen, um Fall-Fälle zu berücksichtigen. Es wäre schön, wenn es einen Standard Weg gibt, es zu finden ... –

+0

@Ben: Richtig, das ist der Vorbehalt mit der Standardressource. –

3

Sie können die GetResourceFileName() Methode der ResourceManager-Klasse verwenden, um einen gültigen Ressourcenkulturnamen zu erstellen. Ein kurzer Blick auf die Methodenimplementierung über Reflector zeigt uns, dass die Methode die Eigenschaft name des CultureInfo-Objekts verwendet, das vom Aufrufer übergeben wurde, um den Ressourcendateinamen zu erstellen.

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(); 
} 

Die GetResourceFileName() -Methode ruft die interne statische Methode VerifyCultureName() wir eine gültige Ressource Kultur Namen zu gewährleisten. Ein Blick in die VerifyCultureName() -Methode zeigt uns, dass eine einfache Validierung stattfindet.

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; 
} 

Zur Nutzung des GetResourceFileName() -Methode machen Sie eine Klasse aus dem Resourcemanager-Typ ableiten müssen und die virtuelle Methode in der Basisklasse außer Kraft setzen. Die GetResourceFileName() -Methode ist geschützt, daher müssen wir sie in eine öffentliche Methode einbetten, um sie der Außenwelt zugänglich zu machen.

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

Das ist nah an dem, was ich von meiner benutzerdefinierten Methode bekomme, die Default.aspx.en-US.resx zurückgeben würde. Die Seite verwendet jedoch Default.aspx.resx, da en-us.resx nicht existiert. Ich überprüfe derzeit, ob en-us.resx oder en.resx vorhanden sind, und falle dann auf die Standard-RESX zurück, was in Ordnung ist. Ich frage mich nur, ob es eine bessere Möglichkeit gibt, es zu finden. –