2009-07-09 4 views
2

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

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

ответ

0

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

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

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

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

+0

Это то, с чего я начал. Он всегда будет указывать вам .aspx.en-US.resx, даже если страница использует .aspx.resx. Я добавил коды для проверки наличия en.resx и en-US.resx для учета случаев возврата. Было бы неплохо, если бы был стандартный способ найти его ... – 2009-07-09 23:18:19

+0

@Ben: право, это предостережение со стандартным ресурсом. –

3

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

Это близко к тому, что я получаю от своего пользовательского метода, который возвращает Default.aspx.en-US.resx. Но на самом деле страница использует Default.aspx.resx, потому что en-us.resx не существует. В настоящее время я проверяю, существуют ли en-us.resx или en.resx, затем вернитесь к умолчанию .resx, который работает нормально. Просто интересно, есть ли лучший/стандартный способ его найти. – 2009-07-09 23:13:20