【问题标题】:Asp.net Core localization with json files [closed]带有 json 文件的 Asp.net Core 本地化 [关闭]
【发布时间】:2017-09-22 18:39:19
【问题描述】:

我正在努力寻找一个关于 asp.net 本地化的好教程。 在官方文档中,解释是关于.resx文件,我想使用json文件。

如果有人有关于如何编写中间件的好教程。

谢谢

【问题讨论】:

    标签: c# asp.net json asp.net-core localization


    【解决方案1】:

    Nuget 包

    https://www.nuget.org/packages/Askmethat.Aspnet.JsonLocalizer/

    解决方案

    经过一番调查,终于在Asp/Localization GitHub中找到了一个例子。

    我在这里为那些不想在不破坏默认文化提供程序的情况下使用平面 json 的人提供。

    数据:

    平面 json :

    [
      {
        "Key": "Hello",
        "LocalizedValue" : {
          "fr-FR": "Bonjour",
          "en-US": "Hello"
        }
      }
    ]
    

    C# 模型:

    class JsonLocalization
        {
            public string Key { get; set; }
            public Dictionary<string, string> LocalizedValue = new Dictionary<string, string>();
    
        }
    

    中间件

    工厂

    这只是为了访问CultureInfo 是StringLocalizer。

     public class JsonStringLocalizerFactory : IStringLocalizerFactory
        {
            public IStringLocalizer Create(Type resourceSource)
            {
                return new JsonStringLocalizer();
            }
    
            public IStringLocalizer Create(string baseName, string location)
            {
                return new JsonStringLocalizer();
            }
        }
    

    定位器

    从 JSON 文件中获取数据的逻辑

    public class JsonStringLocalizer : IStringLocalizer
    {
        List<JsonLocalization> localization = new List<JsonLocalization>();
        public JsonStringLocalizer()
        {
            //read all json file
            JsonSerializer serializer = new JsonSerializer();
            localization = JsonConvert.DeserializeObject<List<JsonLocalization>>(File.ReadAllText(@"localization.json"));
    
        }
    
    
        public LocalizedString this[string name]
        {
            get
            {
                var value = GetString(name);
                return new LocalizedString(name, value ?? name, resourceNotFound: value == null);
            }
        }
    
        public LocalizedString this[string name, params object[] arguments]
        {
            get
            {
                var format = GetString(name);
                var value = string.Format(format ?? name, arguments);
                return new LocalizedString(name, value, resourceNotFound: format == null);
            }
        }
    
        public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures)
        {
            return localization.Where(l => l.LocalizedValue.Keys.Any(lv => lv == CultureInfo.CurrentCulture.Name)).Select(l => new LocalizedString(l.Key, l.LocalizedValue[CultureInfo.CurrentCulture.Name], true));
        }
    
        public IStringLocalizer WithCulture(CultureInfo culture)
        {
            return new JsonStringLocalizer();
        }
    
        private string GetString(string name)
        {
            var query = localization.Where(l => l.LocalizedValue.Keys.Any(lv => lv == CultureInfo.CurrentCulture.Name));
            var value = query.FirstOrDefault(l => l.Key == name);
            return value.LocalizedValue[CultureInfo.CurrentCulture.Name];
        }
    }
    

    通过这个解决方案,您可以在 ViewsControllers 中使用基本的 IStringLocalizer

    当然,如果你有一个大的 json 文件,你可以使用 IMemoryCacheIDistributedMemoryCache 来提高性能。

    编辑:

    在应用程序启动中添加此行以使用您自己的实现:

    services.AddSingleton<IStringLocalizerFactory, JsonStringLocalizerFactory>();
    services.AddSingleton<IStringLocalizer, JsonStringLocalizer>();
    services.AddLocalization(options => options.ResourcesPath = "Resources");
    

    之后,您可以根据自己的全球化偏好进行配置。

    【讨论】:

    • 太好了,你给出了很好的观点 - 我从“JsonStringLocalizerFactory”等的 git 存储库中获得了完美的结果。干得好。
    • 很好的解决方案,但在许多语言文件中拆分资源是合理的,例如 cart.json、messages.json、products.json
    • 每个本地化文化都有一个更通用的父文化,并且根文化是不变的。如果在 LocalizedValue 键中找不到相应的当前文化键,那么我建议您递归搜索可用的第一个父文化。例如。 en 是 en-US 的父文化,如果 en-US 不可用,应在其位置使用。
    • @Orcuz 太棒了!感谢您的信息。顺便说一句,这是一个很棒的项目。
    • @NoymulIslamChowdhury 您应该使用 options.SupportedCultureInfos 来设置可用文化的列表。之后,该库使用与 asp.net 核心本地化相同的机制
    【解决方案2】:

    看看这里,我自己没试过,但看起来很有希望。

    http://ronaldwildenberg.com/asp-net-core-localization-with-json-resource-files/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多