• [Asp.net 5] Localization-简单易用的本地化-全球化信息


    本篇比较简单介绍Localization解决方案中:

    • Microsoft.Framework.Globalization.CultureInfoCache 工程
    • CultureInfoGenerator 工程

    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; }
            }
        }
    CultureInfoCache
    CultureInfoCache Part1
     public static partial class CultureInfoCache
        {
            public static readonly HashSet<string> KnownCultureNames = new HashSet<string>
            {
                #region culture
                "ar",
                .........
                "zh-CHT"
                #endregion
            };
        }
    CultureInfoCache Part2
    • 系统内部使用ConcurrentDictionary<string, CacheEntry>进行数据缓存
    • ConcurrentDictionary是线程安全性的字典表和Dictionary<,>功能类似
    • CacheEntry实际是对CultureInfo的封装,还仅仅在内部使用
    • GetOrAdd方法:如果字典里包含,直接返回;如果不包含,创建之后返回。第一个参数是查找的参数,第二个是func参数,用于创建。
    • KnownCultureNames:用于存放当前环境支持的语言CultureInfo。(和操作系统,.net环境有关系)
    • 因为KnownCultureNames需要动态生成,所以两部分分离了。

    CultureInfoGenerator

    这个工程的作用就是生成Microsoft.Framework.Globalization.CultureInfoCache的Part2,说实话我觉得这个工程这么架构是有问题的。难道每次都重新生成代码吗?不过现有源码是这样的,我只是按照现有逻辑分享给大家。

    说有问题,这个解决方案还真有问题,下面俩个问题需要手工修改下:

    • 修改构造函数,当appEnvironment为null的时候,给默认值。
     public Program(IApplicationEnvironment appEnvironment)
            {
                _appName = appEnvironment == null ? "CultureInfoGenerator" : appEnvironment.ApplicationName;
                _appPath = appEnvironment == null ? "" : appEnvironment.ApplicationBasePath;
            }
    Program
    • 修改outputFilePath路径: ../Microsoft.Framework.Globalization.CultureInfoCache/CultureInfoList.cs至../Microsoft.Framework.Globalization.CultureInfoCache/CultureInfoList.cs.
     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";
            }
  • 相关阅读:
    浏览器操作本地缓存记录一下
    dotnet new Getting ready... Object reference not set to an instance of an object.
    IIS上vue打包后接口跨域解决
    SpringBoot前言
    Node聊天室和socket.io原理与功能总结
    Node加解密原理和功能探索总结
    Node中文件断点续传原理和方法总结
    Node短链原理与功能实现总结
    Node中F2A原理及功能实现总结
    Node图形邮箱手机验证码实现方法总结
  • 原文地址:https://www.cnblogs.com/watermoon2/p/4536196.html
Copyright © 2020-2023  润新知