本篇比較簡單介紹Localization解決方案中:
Microsoft.Framework.Globalization.CultureInfoCache
CultureInfoCache工程的作用是和它的名字一樣,緩沖各個地區的CultureInfo。該工程中只有一個類(分成倆個部分類),而且都超級簡單,下面我們就簡單介紹下把:
CultureInfoCache:核心的緩沖類。對外暴漏靜態方法:CultureInfo GetCultureInfo(string name),能夠根據各地的語言代碼(比如 cn、en等)獲取到各地的CultureInfo。

public static partial class CultureInfoCache { PRivate static readonly ConcurrentDictionary<string, CacheEntry> _cache = new ConcurrentDictionary<string, CacheEntry>(); public static CultureInfo GetCultureInfo(string name) { if (name == null || !KnownCultureNames.Contains(name)) { return null; } var entry = _cache.GetOrAdd(name, n => { try { return new CacheEntry(CultureInfo.ReadOnly(new CultureInfo(n))); } catch (CultureNotFoundException) { return new CacheEntry(cultureInfo: null); } }); return entry.CultureInfo; } private class CacheEntry { public CacheEntry(CultureInfo cultureInfo) { CultureInfo = cultureInfo; } public CultureInfo CultureInfo { get; } } }CultureInfoCacheCultureInfoCache Part1
public static partial class CultureInfoCache { public static readonly HashSet<string> KnownCultureNames = new HashSet<string> { #region culture "ar", ......... "zh-CHT" #endregion }; }CultureInfoCache Part2CultureInfoGenerator
這個工程的作用就是生成Microsoft.Framework.Globalization.CultureInfoCache的Part2,說實話我覺得這個工程這么架構是有問題的。難道每次都重新生成代碼嗎?不過現有源碼是這樣的,我只是按照現有邏輯分享給大家。
說有問題,這個解決方案還真有問題,下面倆個問題需要手工修改下:

public Program(IapplicationEnvironment appEnvironment) { _appName = appEnvironment == null ? "CultureInfoGenerator" : appEnvironment.ApplicationName; _appPath = appEnvironment == null ? "" : appEnvironment.ApplicationBasePath; }Program

var outputFilePath = args.Length > 0 ? args[0] : Path.Combine(_appPath, "../Microsoft.Framework.Globalization.CultureInfoCache/CultureInfoList.cs");outputFilePath
修改后,直接運行該工程,會發現Microsoft.Framework.Globalization.CultureInfoCache解決方案中CultureInfoList.cs文件被更改。
這個文件內還有值得我們注意的,就是版本和.net環境的對應關系
private static string CheckFor45DotVersion(int releaseKey) { if (releaseKey >= 393273) { return "4.6 RC or later"; } if ((releaseKey >= 379893)) { return "4.5.2 or later"; } if ((releaseKey >= 378675)) { return "4.5.1 or later"; } if ((releaseKey >= 378389)) { return "4.5 or later"; } // This line should never execute. A non-null release key should mean // that 4.5 or later is installed. return "No 4.5 or later version detected"; }新聞熱點
疑難解答