файл .resx, используемый страницей - PullRequest
2 голосов
/ 09 июля 2009

Как получить файл .resx, используемый страницей в данный момент? Например, если я установил для fr-FR значение default.aspx, оно должно дать мне значения Default.aspx.fr.resx или Default.aspx.fr-FR.resx или Default.aspx.resx, в зависимости от того, какой из них существует.

У них есть что-то подобное в ASP.NET, или я должен сам написать это?

Ответы [ 2 ]

3 голосов
/ 09 июля 2009

Вы можете использовать метод 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");
    }
}
0 голосов
/ 09 июля 2009

Мне не известно о встроенном свойстве, которое бы возвращало текущий файл ресурсов таким образом.

CultureInfo.CurrentUICulture.Name возвращает текущую используемую UICulture, а свойство Name является сокращенной формой. Вы можете использовать это для создания информации самостоятельно, например:

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

В зависимости от того, что вы планируете делать с этой информацией, я буду несколько осторожен, и вы должны проверить этот подход для вашего сценария.

...