페이지에서 현재 사용중인 .resx 파일을 어떻게 얻습니까? 예를 들어 Default.aspx에서 culture를 fr-FR로 설정하면 Default.aspx.fr.resx 나 Default.aspx.fr-FR.resx 또는 Default.aspx.resx가 어느 것이 있는지에 따라 달라집니다..resx 파일 페이지가 현재 사용 중임
그들은 ASP.NET에서 이와 비슷한 것을 가지고 있습니까? 아니면 직접 작성해야합니까?
페이지에서 현재 사용중인 .resx 파일을 어떻게 얻습니까? 예를 들어 Default.aspx에서 culture를 fr-FR로 설정하면 Default.aspx.fr.resx 나 Default.aspx.fr-FR.resx 또는 Default.aspx.resx가 어느 것이 있는지에 따라 달라집니다..resx 파일 페이지가 현재 사용 중임
그들은 ASP.NET에서 이와 비슷한 것을 가지고 있습니까? 아니면 직접 작성해야합니까?
저는이 방법으로 현재 리소스 파일을 반환하는 기본 제공 속성을 알지 못합니다.
CultureInfo.CurrentUICulture.Name
은 현재 사용중인 UICulture를 반환하며 Name 속성은 축약 된 형식입니다.
string pageResx = VirtualPathUtility.GetFileName(Request.Path) + "." +
CultureInfo.CurrentUICulture.Name + ".resx";
당신은 내가 다소 신중한 것이 정보와 함께 할 어떤 계획에 따라 당신은 당신의 시나리오에이 방법을 테스트해야합니다 : 당신은 예를 들어, 정보를 직접 구축하려면이 옵션을 사용할 수 있습니다.
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");
}
}
이것은 내 사용자 지정 메서드에서 얻은 것과 비슷하며 Default.aspx.en-US.resx를 반환합니다. 그러나 en-us.resx가 없기 때문에이 페이지는 실제로 Default.aspx.resx를 사용하고 있습니다. 현재 en-us.resx 또는 en.resx가 있는지 확인한 다음 기본 .resx로 돌아가 확인합니다. 그것을 찾는 더 나은/표준 방법이 있는지 궁금합니다. –
이것은 내가 시작한 것입니다. 페이지에서 .aspx.resx를 사용하는 경우에도 항상 .aspx.en-US.resx를 알려줍니다. 나는 fall back cases를 설명하기 위해 en.resx와 en-US.resx의 존재를 확인하는 코드를 추가했다. 그것을 발견하는 표준 방법이 있다면 그것은 좋을 것입니다 ... –
@Ben : 맞습니다. 기본 리소스가있는 경고입니다. –