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

首頁 > 學院 > 開發設計 > 正文

[Asp.net 5] Localization-resx資源文件的管理

2019-11-17 02:07:58
字體:
來源:轉載
供稿:網友

[asp.net 5] Localization-resx資源文件的管理

上一篇博文地址:[Asp.net 5] Localization-簡單易用的本地化-全球化信息

本文繼續介紹asp.net 5多語言。今天重點講的是多語言的resx文件。涉及到的工程有:Microsoft.Framework.Localization.Abstractions以及Microsoft.Framework.Localization。他們之間的類結構如下如所示:

  • Abstractions包中,包含了定義在工程Microsoft.Framework.Localization.Abstractions的大部分類和接口
  • Localization包中,包含了定義在工程Microsoft.Framework.Localization中的大部分類和接口

Microsoft.Framework.Localization.Abstractions

該工程定義了本地化(全球化)的基本接口,以及一些抽象類。

  • LocalizedString 封裝name、value等屬性的結構體,用于表示本地化尋找的結果
  • IStringLocalizer 本地化訪問的基本接口,通過方法或者屬性(通過擴展方法,使得方法和屬性調用一套邏輯)獲得LocalizedString結構體對象;本解決方案中,對資源文件就是該接口的 實例操作的
  • IStringLocalizer<T> 本接口中未定義任何方法,是IStringLocalizer 的泛型版本
  • StringLocalizer<TResourceSource>,該類是IStringLocalizer<T> 的實現類,內部分裝IStringLocalizer 接口。使用了代理模式(前面我們介紹的配置文件、以及依賴注入都使用了該模式),所有方法都是內部IStringLocalizer對象的封裝。該類的構造函數是IStringLocalizerFactory接口。
  • IStringLocalizerFactory接口:根據不同的Type類型創建不同的IStringLocalizer對象
public struct LocalizedString    {        public LocalizedString([NotNull] string name, [NotNull] string value)            : this(name, value, resourceNotFound: false)        {        }        public LocalizedString([NotNull] string name, [NotNull] string value, bool resourceNotFound)        {            Name = name;            Value = value;            ResourceNotFound = resourceNotFound;        }        public static implicit Operator string (LocalizedString localizedString)        {            return localizedString.Value;        }        public string Name { get; }        public string Value { get; }        public bool ResourceNotFound { get; }        public override string ToString() => Value;    }
LocalizedString
    public interface IStringLocalizer : IEnumerable<LocalizedString>    {        LocalizedString this[string name] { get; }        LocalizedString this[string name, params object[] arguments] { get; }                IStringLocalizer WithCulture(CultureInfo culture);    }
IStringLocalizer
public interface IStringLocalizer<T> : IStringLocalizer    {    }public class StringLocalizer<TResourceSource> : IStringLocalizer<TResourceSource>    {        PRivate IStringLocalizer _localizer;        public StringLocalizer([NotNull] IStringLocalizerFactory factory)        {            _localizer = factory.Create(typeof(TResourceSource));        }        public virtual IStringLocalizer WithCulture(CultureInfo culture) => _localizer.WithCulture(culture);        public virtual LocalizedString this[[NotNull] string name] => _localizer[name];        public virtual LocalizedString this[[NotNull] string name, params object[] arguments] =>            _localizer[name, arguments];        public virtual LocalizedString GetString([NotNull] string name) => _localizer.GetString(name);        public virtual LocalizedString GetString([NotNull] string name, params object[] arguments) =>            _localizer.GetString(name, arguments);        public IEnumerator<LocalizedString> GetEnumerator() => _localizer.GetEnumerator();        IEnumerator IEnumerable.GetEnumerator() => _localizer.GetEnumerator();    }
StringLocalizer

根據上面的介紹,我們可以推斷該類庫的使用方式如下:

public void Test(){           IStringLocalizerFactory factory=new ResourceManagerStringLocalizerFactory();       IStringLocalizer localizer=new StringLocalizer<TType>(factory);       //IStringLocalizer<TType> localizer=new StringLocalizer<TType>();       //localizer=localizer.WithCulture(CultureInfo.CurrentUICulture);       var localizedString=localizer.GetString(key);}

[StringLocalizer<TResource>的作用就是隱藏具體IStringLocalizer,使我們不用關心是哪個IStringLocalizer,這樣做對于直接書寫代碼可能看不出直接意義,但是如果使用依賴注入,則可以明顯的看出好處,我們可以為IStringLocalizer<TType>直接注入StringLocalizer<TType>類]

[如果對于依賴注入了解不多,可以看下篇博客:DependencyInjection項目代碼分析-目錄,略長]

Microsoft.Framework.Localization

  • ResourceManagerStringLocalizerFactory:創建ResourceManagerStringLocalizer類資源
  • ResourceManagerStringLocalizer:resx多語言文件的訪問器(實際該代碼并未另起灶爐,而是使用了ResourceManager類)
  • ResourceManagerWithCultureStringLocalizer:ResourceManagerStringLocalizer的子類,提供多語言訪問接口。該類實際上是在父類中WithCulture中創建,而該方法內實際也是一個類似于代理模式的設計
  • LocalizationServiceCollectionExtensions類:該類將ResourceManagerStringLocalizerFactory注入到IStringLocalizerFactory接口,StringLocalizer<T> 注入到IStringLocalizer<T> 接口。
public class ResourceManagerStringLocalizerFactory : IStringLocalizerFactory    {        private readonly IapplicationEnvironment _applicationEnvironment;        public ResourceManagerStringLocalizerFactory([NotNull] IApplicationEnvironment applicationEnvironment)        {            _applicationEnvironment = applicationEnvironment;        }        public IStringLocalizer Create([NotNull] Type resourceSource)        {            var typeInfo = resourceSource.GetTypeInfo();            var assembly = new AssemblyWrapper(typeInfo.Assembly);            var baseName = typeInfo.FullName;            return new ResourceManagerStringLocalizer(new ResourceManager(resourceSource), assembly, baseName);        }        public IStringLocalizer Create([NotNull] string baseName, [NotNull] string location)        {            var assembly = Assembly.Load(new AssemblyName(location ?? _applicationEnvironment.ApplicationName));            return new ResourceManagerStringLocalizer(                new ResourceManager(baseName, assembly),                new AssemblyWrapper(assembly),                baseName);        }    }
ResourceManagerStringLocalizerFactory
public class ResourceManagerStringLocalizer : IStringLocalizer    {        private static readonly ConcurrentDictionary<string, IList<string>> _resourceNamesCache =            new ConcurrentDictionary<string, IList<string>>();        private readonly ConcurrentDictionary<string, object> _
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肥乡县| 武夷山市| 全南县| 门源| 宁武县| 泸溪县| 宁夏| 米脂县| 遵义市| 尚志市| 榆树市| 宁蒗| 苏州市| 望江县| 宁化县| 滁州市| 黑山县| 高阳县| 亚东县| 聊城市| 鱼台县| 承德市| 霍城县| 盐边县| 合江县| 雷波县| 科尔| 利辛县| 泾川县| 怀仁县| 读书| 喀喇| 象州县| 璧山县| 濮阳市| 鄂伦春自治旗| 马关县| 龙江县| 涟源市| 鱼台县| 沙雅县|