我的 Web 应用程序通过使用 ResourceManager 放置在附属程序集中的资源文件来处理本地化。由于应用程序正在增长,我想将 resx 文件拆分为多个文件(针对每种语言),但在客户端,似乎我必须为要读取的每个文件创建一个 ResourceManager 实例。有没有办法将多个 resx 文件打包成一个文件?
谢谢
我的 Web 应用程序通过使用 ResourceManager 放置在附属程序集中的资源文件来处理本地化。由于应用程序正在增长,我想将 resx 文件拆分为多个文件(针对每种语言),但在客户端,似乎我必须为要读取的每个文件创建一个 ResourceManager 实例。有没有办法将多个 resx 文件打包成一个文件?
谢谢
如果您使用的是网站(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;
}
}
您需要通过使用资源项目程序集名称传递参数来实例化该类,您可以从项目属性中获取此信息。我还添加了一个“资源”字段,如果您决定覆盖每个 .resx 文件的默认命名空间,这应该很有用,请注意,您可能希望扩展此类以允许 .resx 文件使用多个“命名空间”(附截图)