2009-07-09 3 views
2

페이지에서 현재 사용중인 .resx 파일을 어떻게 얻습니까? 예를 들어 Default.aspx에서 culture를 fr-FR로 설정하면 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.resx를 사용하는 경우에도 항상 .aspx.en-US.resx를 알려줍니다. 나는 fall back cases를 설명하기 위해 en.resx와 en-US.resx의 존재를 확인하는 코드를 추가했다. 그것을 발견하는 표준 방법이 있다면 그것은 좋을 것입니다 ... –

+0

@Ben : 맞습니다. 기본 리소스가있는 경고입니다. –

3

ResourceManager 클래스의 GetResourceFileName() 메서드를 사용하여 유효한 리소스 문화권 이름을 구성 할 수 있습니다. 리플렉터를 통한 메소드 구현을 빠르게 살펴보면이 메소드는 호출자가 전달한 CultureInfo 객체의 name 속성을 사용하여 리소스 파일 이름을 작성한다는 것을 알 수 있습니다.

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; 
} 

는 ResourceManager에 유형에서 클래스를 파생하고 기본 클래스의 가상 메서드를 재정의해야합니다 GetResourceFileName() 메소드의 사용을 확인하십시오. GetResourceFileName() 메서드는 보호되어 있으므로 public 메서드로 래핑하여 외부에 공개해야합니다.

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를 반환합니다. 그러나 en-us.resx가 없기 때문에이 페이지는 실제로 Default.aspx.resx를 사용하고 있습니다. 현재 en-us.resx 또는 en.resx가 있는지 확인한 다음 기본 .resx로 돌아가 확인합니다. 그것을 찾는 더 나은/표준 방법이 있는지 궁금합니다. –

관련 문제