如何获取页面当前使用的 .resx 文件?例如,如果我在 Default.aspx 上将区域性设置为 fr-FR,它应该为我提供 Default.aspx.fr.resx 或 Default.aspx.fr-FR.resx 或 Default.aspx.resx 取决于哪一个存在。
他们在 ASP.NET 中有类似的东西还是我必须自己编写?
最佳答案
您可以使用GetResourceFileName() ResourceManager 类的方法来构造有效的资源区域性名称。通过反射器快速浏览一下方法实现,我们会发现该方法利用调用者传递的 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;
}
要使用 GetResourceFileName() 方法,您必须从 ResourceManager 类型派生一个类并重写基类中的虚拟方法。 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");
}
}
关于asp.net - 页面当前使用的.resx文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1101264/