Globalization در ASP.NET MVC - قسمت چهارم
نویسنده: یوسف نژاد
تاریخ: ۱۳۹۲/۰۲/۲۴ ۲۱:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public abstract class ResourceProviderFactory
{
public abstract IResourceProvider CreateGlobalResourceProvider(string classKey);
public abstract IResourceProvider CreateLocalResourceProvider(string virtualPath);
}public interface IResourceProvider
{
IResourceReader ResourceReader { get; }
object GetObject(string resourceKey, CultureInfo culture);
}// Type: System.Web.Compilation.ResXResourceProviderFactory
// Assembly: System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// Assembly location: C:\Windows\Microsoft.NET\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll
using System.Runtime;
using System.Web;
namespace System.Web.Compilation
{
internal class ResXResourceProviderFactory : ResourceProviderFactory
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public ResXResourceProviderFactory() { }
public override IResourceProvider CreateGlobalResourceProvider(string classKey)
{
return (IResourceProvider) new GlobalResXResourceProvider(classKey);
}
public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
{
return (IResourceProvider) new LocalResXResourceProvider(VirtualPath.Create(virtualPath));
}
}
}internal class GlobalResXResourceProvider : BaseResXResourceProvider
{
private string _classKey;
internal GlobalResXResourceProvider(string classKey)
{
_classKey = classKey;
}
protected override ResourceManager CreateResourceManager()
{
string fullClassName = BaseResourcesBuildProvider.DefaultResourcesNamespace + "." + _classKey;
// If there is no app resource assembly, return null
if (BuildManager.AppResourcesAssembly == null)
return null;
ResourceManager resourceManager = new ResourceManager(fullClassName, BuildManager.AppResourcesAssembly);
resourceManager.IgnoreCase = true;
return resourceManager;
}
public override IResourceReader ResourceReader
{
get
{
// App resources don't support implicit resources, so the IResourceReader should never be needed
throw new NotSupportedException();
}
}
}internal const string DefaultResourcesNamespace = "Resources";
internal class LocalResXResourceProvider : BaseResXResourceProvider
{
private VirtualPath _virtualPath;
internal LocalResXResourceProvider(VirtualPath virtualPath)
{
_virtualPath = virtualPath;
}
protected override ResourceManager CreateResourceManager()
{
ResourceManager resourceManager = null;
Assembly pageResAssembly = GetLocalResourceAssembly();
if (pageResAssembly != null)
{
string fileName = _virtualPath.FileName;
resourceManager = new ResourceManager(fileName, pageResAssembly);
resourceManager.IgnoreCase = true;
}
else
{
throw new InvalidOperationException(SR.GetString(SR.ResourceExpresionBuilder_PageResourceNotFound));
}
return resourceManager;
}
public override IResourceReader ResourceReader
{
get
{
// Get the local resource assembly for this page
Assembly pageResAssembly = GetLocalResourceAssembly();
if (pageResAssembly == null) return null;
// Get the name of the embedded .resource file for this page
string resourceFileName = _virtualPath.FileName + ".resources";
// Make it lower case, since GetManifestResourceStream is case sensitive
resourceFileName = resourceFileName.ToLower(CultureInfo.InvariantCulture);
// Get the resource stream from the resource assembly
Stream resourceStream = pageResAssembly.GetManifestResourceStream(resourceFileName);
// If this page has no resources, return null
if (resourceStream == null) return null;
return new ResourceReader(resourceStream);
}
}
[PermissionSet(SecurityAction.Assert, Unrestricted = true)]
private Assembly GetLocalResourceAssembly()
{
// Remove the page file name to get its directory
VirtualPath virtualDir = _virtualPath.Parent;
// Get the name of the local resource assembly
string cacheKey = BuildManager.GetLocalResourcesAssemblyName(virtualDir);
BuildResult result = BuildManager.GetBuildResultFromCache(cacheKey);
if (result != null)
{
return ((BuildResultCompiledAssembly)result).ResultAssembly;
}
return null;
}
}internal abstract class BaseResXResourceProvider : IResourceProvider
{
private ResourceManager _resourceManager;
///// IResourceProvider implementation
public virtual object GetObject(string resourceKey, CultureInfo culture)
{
// Attempt to get the resource manager
EnsureResourceManager();
// If we couldn't get a resource manager, return null
if (_resourceManager == null) return null;
if (culture == null) culture = CultureInfo.CurrentUICulture;
return _resourceManager.GetObject(resourceKey, culture);
}
public virtual IResourceReader ResourceReader { get { return null; } }
///// End of IResourceProvider implementation
protected abstract ResourceManager CreateResourceManager();
private void EnsureResourceManager()
{
if (_resourceManager != null) return;
_resourceManager = CreateResourceManager();
}
}System.Resources.ResourceManager(string baseName, Assembly assemblyName)
var manager = new System.Resources.ResourceManager("Resources.Resource1", typeof(Resource1).Assembly)var manager = new System.Resources.ResourceManager("Resources.Resource1", Assembly.LoadFile(@"c:\MyResources\MyGlobalResources.dll"))public static ResourceManager CreateFileBasedResourceManager(string baseName, string resourceDir, Type usingResourceSet)
resgen d:\MyResources\MyResource.fa.resx
private ResourceManager CreateGlobalResourceManager(string classKey)
{
var baseName = "Resources." + classKey;
var buildManagerType = typeof(BuildManager);
var property = buildManagerType.GetProperty("AppResourcesAssembly", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetField);
var appResourcesAssembly = (Assembly)property.GetValue(null, null);
return new ResourceManager(baseName, appResourcesAssembly) { IgnoreCase = true };
}var manager = CreateGlobalResourceManager("Resource1");
Label1.Text = manager.GetString("String1");private ResourceManager CreateLocalResourceManager(string virtualPath)
{
var virtualPathType = typeof(BuildManager).Assembly.GetType("System.Web.VirtualPath", true);
var virtualPathInstance = Activator.CreateInstance(virtualPathType, BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { virtualPath }, CultureInfo.InvariantCulture);
var buildResultCompiledAssemblyType = typeof(BuildManager).Assembly.GetType("System.Web.Compilation.BuildResultCompiledAssembly", true);
var propertyResultAssembly = buildResultCompiledAssemblyType.GetProperty("ResultAssembly", BindingFlags.NonPublic | BindingFlags.Instance);
var methodGetLocalResourcesAssemblyName = typeof(BuildManager).GetMethod("GetLocalResourcesAssemblyName", BindingFlags.NonPublic | BindingFlags.Static);
var methodGetBuildResultFromCache = typeof(BuildManager).GetMethod("GetBuildResultFromCache", BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { typeof(string) }, null);
var fileNameProperty = virtualPathType.GetProperty("FileName");
var virtualPathFileName = (string)fileNameProperty.GetValue(virtualPathInstance, null);
var parentProperty = virtualPathType.GetProperty("Parent");
var virtualPathParent = parentProperty.GetValue(virtualPathInstance, null);
var localResourceAssemblyName = (string)methodGetLocalResourcesAssemblyName.Invoke(null, new object[] { virtualPathParent });
var buildResultFromCache = methodGetBuildResultFromCache.Invoke(null, new object[] { localResourceAssemblyName });
Assembly localResourceAssembly = null;
if (buildResultFromCache != null)
localResourceAssembly = (Assembly)propertyResultAssembly.GetValue(buildResultFromCache, null);
if (localResourceAssembly == null)
throw new InvalidOperationException("Unable to find the matching resource file.");
return new ResourceManager(virtualPathFileName, localResourceAssembly) { IgnoreCase = true };
}var manager = CreateLocalResourceManager("~/Default.aspx");
Label1.Text = manager.GetString("Label1.Text");