我的Web应用程序通过使用ResourceManager放置在附属程序集中的资源文件来处理本地化。由于应用程序正在增长,我想将resx文件拆分为多个文件(对于每种语言),但在客户端,似乎我必须为我想要读取的每个文件创建一个ResourceManager实例。有没有办法将多个resx文件包装成单个文件?
由于
答案 0 :(得分:0)
如果您使用的是网站(ASP.NET网站项目模板),您可能需要这样做:HttpContext.GetGlobalResourceObject(classKey, resourceKey)
其中classKey是.resx文件的名称,resourceKey是资源中的本地化字符串。
如果您正在使用WebApplications并且您将资源作为单独的项目(C#库),您可能需要查看此代码:
public class SatelliteResourceManager
{
private const string Resources = "Resources";
private readonly string _assemblyName;
public SatelliteResourceManager(string assemblyName)
{
_assemblyName = assemblyName;
}
public Assembly Assembly { get { return Assembly.Load(_assemblyName); } }
protected IEnumerable<Type> ResourceTypes
{
get
{
return Assembly.GetTypes().Where(a => a.IsClass && a.Namespace == Resources);
}
}
public IEnumerable<ResourceManager> GetAllManagers()
{
foreach (var manager in ResourceTypes)
{
yield return (ResourceManager) manager.GetProperty("ResourceManager").GetValue(this, null);
}
}
public string GetGlobalResource(string classKey, string resourceKey, string fallback)
{
var manager = GetAllManagers().FirstOrDefault(m => m.BaseName.EndsWith(classKey, StringComparison.InvariantCultureIgnoreCase));
if (manager != null) return manager.GetString(resourceKey);
return fallback;
}
}
您需要通过传递带有资源项目程序集名称的参数来实例化该类,您可以从项目属性中获取此信息。 我还添加了一个字段“Resources”,如果您决定覆盖每个.resx文件的默认命名空间,这应该很有用,请注意您可能希望扩展此类以允许.resx文件的多个“命名空间”(附带屏幕截图) )