原文很长,为了便于阅读和理解,特将该文章改写成通俗易懂而且内容精炼的中文.
预备知识:系统默认的处理资源和本地化的方法是使用resx文件存储资源.
要使用自定义的resource provider,需要2个步骤:
a) 修改web.config 文件,以便系统使用自定义的资源提供者
b) 建立自定义资源提供者类,最少包括3个:
1.ResourceProviderFactory,工厂类,用来建立ResourceProvider对象.
2.ResourceProvider,实现IResourceProvider,IImplicitResourceProvider,IwwResourceProvider 接口.
3.ResourceReader 实现IResourceReader.
修改web.config 文件,以使用自定义的资源提供者。
复制代码 代码如下:
<configuration>
<system.web>
<globalization resourceProviderFactoryType="Westwind.Globalization.DbSimpleResourceProviderFactory,Westwind.Globalization" />
</system.web>
</configuration>
建立自定义资源提供者类:
1.工厂类
复制代码 代码如下:
[DesignTimeResourceProviderFactoryAttribute(typeof(DbDesignTimeResourceProviderFactory))]
public class DbSimpleResourceProviderFactory : ResourceProviderFactory
{
public override IResourceProvider CreateGlobalResourceProvider(string classname)
{
return new DbSimpleResourceProvider(null, classname);
}
public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
{
string ResourceSetName = DbResourceConfiguration.Current.StripVirtualPath(virtualPath);
return new DbSimpleResourceProvider(null,ResourceSetName.ToLower());
}
}
2.提供者类
复制代码 代码如下:
public class DbSimpleResourceProvider : IResourceProvider, IImplicitResourceProvider
{
private string _ResourceSetName;
private IDictionary _resourceCache;
private DbSimpleResourceProvider()
{ }
public DbSimpleResourceProvider(string virtualPath, string className)
{
_ResourceSetName = className;
}
private IDictionary GetResourceCache(string cultureName)
{
if (cultureName == null)
cultureName = "";
if (this._resourceCache == null)
this._resourceCache = new ListDictionary();
IDictionary Resources = this._resourceCache[cultureName] as IDictionary;
if (Resources == null)
{
// *** DEPENDENCY HERE (#1): Using DbResourceDataManager to retrieve resources
// *** Use datamanager to retrieve the resource keys from the database
DbResourceDataManager Data = new DbResourceDataManager();
Resources = Data.GetResourceSet(cultureName as string, this._ResourceSetName);
this._resourceCache[cultureName] = Resources;
}
return Resources;
}
public void ClearResourceCache()
{
this._resourceCache.Clear();
}
object IResourceProvider.GetObject(string ResourceKey, CultureInfo Culture)
{
string CultureName = null;
if (Culture != null)
CultureName = Culture.Name;
else
CultureName = CultureInfo.CurrentUICulture.Name;
return this.GetObjectInternal(ResourceKey, CultureName);
}
object GetObjectInternal(string ResourceKey, string CultureName)
{
IDictionary Resources = this.GetResourceCache(CultureName);
object value = null;
if (Resources == null)
value = null;
else
value = Resources[ResourceKey];
// *** If we're at a specific culture (en-Us) and there's no value fall back
// *** to the generic culture (en)
if (value == null && CultureName.Length > 3)
{
// *** try again with the 2 letter locale
return GetObjectInternal(ResourceKey,CultureName.Substring(0,2) );
}
// *** If the value is still null get the invariant value
if (value == null)
{
Resources = this.GetResourceCache("");
if (Resources == null)
value = null;
else
value = Resources[ResourceKey];
}
// *** If the value is still null and we're at the invariant culture
// *** let's add a marker that the value is missing
// *** this also allows the pre-compiler to work and never return null
if (value == null && string.IsNullOrEmpty(CultureName))
{
// *** No entry there
value = "";
// *** DEPENDENCY HERE (#2): using DbResourceConfiguration and DbResourceDataManager to optionally
// add missing resource keys
// *** Add a key in the repository at least for the Invariant culture
// *** Something's referencing but nothing's there
if (DbResourceConfiguration.Current.AddMissingResources)
new DbResourceDataManager().AddResource(ResourceKey, value.ToString(), "", this._ResourceSetName);
}
return value;
}
3.Reader类
复制代码 代码如下:
public class DbSimpleResourceReader : IResourceReader
{
private IDictionary _resources;
public DbSimpleResourceReader(IDictionary resources)
{
_resources = resources;
}
IDictionaryEnumerator IResourceReader.GetEnumerator()
{
return _resources.GetEnumerator();
}
void IResourceReader.Close()
{
}
IEnumerator IEnumerable.GetEnumerator()
{
return _resources.GetEnumerator();
}
void IDisposable.Dispose()
{
}
}
完毕。
本人没有测试过,待测试通过,献上最精炼的源代码.敬请稍候.
预备知识:系统默认的处理资源和本地化的方法是使用resx文件存储资源.
要使用自定义的resource provider,需要2个步骤:
a) 修改web.config 文件,以便系统使用自定义的资源提供者
b) 建立自定义资源提供者类,最少包括3个:
1.ResourceProviderFactory,工厂类,用来建立ResourceProvider对象.
2.ResourceProvider,实现IResourceProvider,IImplicitResourceProvider,IwwResourceProvider 接口.
3.ResourceReader 实现IResourceReader.
修改web.config 文件,以使用自定义的资源提供者。
复制代码 代码如下:
<configuration>
<system.web>
<globalization resourceProviderFactoryType="Westwind.Globalization.DbSimpleResourceProviderFactory,Westwind.Globalization" />
</system.web>
</configuration>
建立自定义资源提供者类:
1.工厂类
复制代码 代码如下:
[DesignTimeResourceProviderFactoryAttribute(typeof(DbDesignTimeResourceProviderFactory))]
public class DbSimpleResourceProviderFactory : ResourceProviderFactory
{
public override IResourceProvider CreateGlobalResourceProvider(string classname)
{
return new DbSimpleResourceProvider(null, classname);
}
public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
{
string ResourceSetName = DbResourceConfiguration.Current.StripVirtualPath(virtualPath);
return new DbSimpleResourceProvider(null,ResourceSetName.ToLower());
}
}
2.提供者类
复制代码 代码如下:
public class DbSimpleResourceProvider : IResourceProvider, IImplicitResourceProvider
{
private string _ResourceSetName;
private IDictionary _resourceCache;
private DbSimpleResourceProvider()
{ }
public DbSimpleResourceProvider(string virtualPath, string className)
{
_ResourceSetName = className;
}
private IDictionary GetResourceCache(string cultureName)
{
if (cultureName == null)
cultureName = "";
if (this._resourceCache == null)
this._resourceCache = new ListDictionary();
IDictionary Resources = this._resourceCache[cultureName] as IDictionary;
if (Resources == null)
{
// *** DEPENDENCY HERE (#1): Using DbResourceDataManager to retrieve resources
// *** Use datamanager to retrieve the resource keys from the database
DbResourceDataManager Data = new DbResourceDataManager();
Resources = Data.GetResourceSet(cultureName as string, this._ResourceSetName);
this._resourceCache[cultureName] = Resources;
}
return Resources;
}
public void ClearResourceCache()
{
this._resourceCache.Clear();
}
object IResourceProvider.GetObject(string ResourceKey, CultureInfo Culture)
{
string CultureName = null;
if (Culture != null)
CultureName = Culture.Name;
else
CultureName = CultureInfo.CurrentUICulture.Name;
return this.GetObjectInternal(ResourceKey, CultureName);
}
object GetObjectInternal(string ResourceKey, string CultureName)
{
IDictionary Resources = this.GetResourceCache(CultureName);
object value = null;
if (Resources == null)
value = null;
else
value = Resources[ResourceKey];
// *** If we're at a specific culture (en-Us) and there's no value fall back
// *** to the generic culture (en)
if (value == null && CultureName.Length > 3)
{
// *** try again with the 2 letter locale
return GetObjectInternal(ResourceKey,CultureName.Substring(0,2) );
}
// *** If the value is still null get the invariant value
if (value == null)
{
Resources = this.GetResourceCache("");
if (Resources == null)
value = null;
else
value = Resources[ResourceKey];
}
// *** If the value is still null and we're at the invariant culture
// *** let's add a marker that the value is missing
// *** this also allows the pre-compiler to work and never return null
if (value == null && string.IsNullOrEmpty(CultureName))
{
// *** No entry there
value = "";
// *** DEPENDENCY HERE (#2): using DbResourceConfiguration and DbResourceDataManager to optionally
// add missing resource keys
// *** Add a key in the repository at least for the Invariant culture
// *** Something's referencing but nothing's there
if (DbResourceConfiguration.Current.AddMissingResources)
new DbResourceDataManager().AddResource(ResourceKey, value.ToString(), "", this._ResourceSetName);
}
return value;
}
3.Reader类
复制代码 代码如下:
public class DbSimpleResourceReader : IResourceReader
{
private IDictionary _resources;
public DbSimpleResourceReader(IDictionary resources)
{
_resources = resources;
}
IDictionaryEnumerator IResourceReader.GetEnumerator()
{
return _resources.GetEnumerator();
}
void IResourceReader.Close()
{
}
IEnumerator IEnumerable.GetEnumerator()
{
return _resources.GetEnumerator();
}
void IDisposable.Dispose()
{
}
}
完毕。
本人没有测试过,待测试通过,献上最精炼的源代码.敬请稍候.
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月15日
2024年11月15日
- 老头杯第二届规则是什么 英雄联盟老头杯第二届规则介绍
- 王崴-爵士听堂.蓝色波萨(HQCD)[WAV+CUE]
- 群星《欧美动听情歌·柔情第5季》2CD【DTS-WAV分轨】
- [极品珍藏]德意志进行曲集卡拉扬SACD[WAV+CUE]
- 前暴雪制作人呼吁反击DEI 玩家:夺回文化!
- 腾讯证实子公司Sharkmob大规模裁员:整个市场很低迷
- 荣耀加冕 问鼎冠军 中国代表队获第四届东亚电竞锦标赛团体总冠军
- 污甩乐队.2024-Let.the.dirt.left【摩登天空】【FLAC分轨】
- 杜德伟.1994-ALL.FOR.YOU(英)【滚石】【WAV+CUE】
- 群星.2013-百代好声音ADMSCD1【EMI百代】【WAV+CUE】
- 群星《私人音乐精选示范碟》PRIVATEMUSIC 发烧唱片名碟[WAV+CUE][1.1G]
- 山口百惠《あなたへの子守唄》日本索尼钢刻字首版[WAV分轨][1.1G]
- 群星《宝丽金20周年特别发烧版》1:1母盘直刻限量编号[低速原抓WAV+CUE][1G]
- 凤飞飞.1984-仲夏(夏艳)[WAV]
- 常安《民歌红·江南燕》DTS-ES6.1[WAV]