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");
}
}
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 ... –
@Ben: Richtig, das ist der Vorbehalt mit der Standardressource. –