国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

建立自定義的數據驅動的本地化資源provider

2024-07-10 13:25:41
字體:
來源:轉載
供稿:網友
原文很長,為了便于閱讀和理解,特將該文章改寫成通俗易懂而且內容精煉的中文.

預備知識:系統默認的處理資源和本地化的方法是使用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()
{
}
}


完畢。
本人沒有測試過,待測試通過,獻上最精煉的源代碼.敬請稍候.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岐山县| 台湾省| 吐鲁番市| 濉溪县| 保康县| 阳高县| 惠州市| 新晃| 白朗县| 类乌齐县| 黄龙县| 铜川市| 万年县| 农安县| 五家渠市| 四会市| 闻喜县| 达拉特旗| 墨玉县| 荆州市| 阿瓦提县| 平原县| 错那县| 剑阁县| 新疆| 呈贡县| 方城县| 云南省| 电白县| 三门县| 余干县| 昔阳县| 巴塘县| 平昌县| 中牟县| 兰坪| 梁河县| 赤城县| 阳新县| 泰来县| 鹤山市|