Вы можете использовать метод GetResourceFileName () класса 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");
}
}