Вы можете использовать метод класса ResourceManager , чтобы создать допустимое имя культуры ресурса. Быстрый взгляд на реализацию методов с помощью отражателя показывает нам, что метод использует свойство name объекта CultureInfo, переданного вызывающим устройством для создания имени файла ресурса.
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");
}
}
Это то, с чего я начал. Он всегда будет указывать вам .aspx.en-US.resx, даже если страница использует .aspx.resx. Я добавил коды для проверки наличия en.resx и en-US.resx для учета случаев возврата. Было бы неплохо, если бы был стандартный способ найти его ... – 2009-07-09 23:18:19
@Ben: право, это предостережение со стандартным ресурсом. –