如何获取该页面当前使用的.resx文件?例如,如果我在Default.aspx上将culture设置为fr-FR,它应该给我Default.aspx.fr.resx或Default.aspx.fr-FR.resx或Default.aspx.resx取决于哪一个存在。< / p>
他们在ASP.NET中有这样的东西,或者我必须自己编写吗?
答案 0 :(得分: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;
}
要使用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");
}
}
答案 1 :(得分:0)
我不知道会以这种方式返回当前资源文件的内置属性。
CultureInfo.CurrentUICulture.Name
返回当前使用的UICulture,Name属性是缩写形式。您可以使用它来自行构建信息,例如:
string pageResx = VirtualPathUtility.GetFileName(Request.Path) + "." +
CultureInfo.CurrentUICulture.Name + ".resx";
根据您打算对此信息的处理方式,我会有些谨慎,您应该针对您的方案测试此方法。