3
我的web应用程序使用ResourceManager通过放置在附属程序集中的资源文件来处理本地化。由于应用程序正在增长,我想将resx文件拆分为多个文件(对于每种语言),但在客户端,似乎必须为每个要读取的文件创建一个ResourceManager实例。有什么办法可以将多个resx文件封装到一个文件中?使用多个resx文件进行本地化
感谢
我的web应用程序使用ResourceManager通过放置在附属程序集中的资源文件来处理本地化。由于应用程序正在增长,我想将resx文件拆分为多个文件(对于每种语言),但在客户端,似乎必须为每个要读取的文件创建一个ResourceManager实例。有什么办法可以将多个resx文件封装到一个文件中?使用多个resx文件进行本地化
感谢
如果您正在使用的网站(ASP.NET网站项目模板),你可能想这样做:HttpContext.GetGlobalResourceObject(classKey, resourceKey)
其中的ClassKey是你的.resx文件的名称,获取ResourceKey是在本地化字符串您资源。
如果您使用的web应用,你有你的资源作为一个单独的项目(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文件提供多个“名称空间”(截图附)